Terminer un processus

Résolu
kyript Messages postés 346 Date d'inscription jeudi 7 avril 2005 Statut Membre Dernière intervention 26 mars 2012 - 26 juil. 2005 à 19:09
kyript Messages postés 346 Date d'inscription jeudi 7 avril 2005 Statut Membre Dernière intervention 26 mars 2012 - 29 juil. 2005 à 14:29
bonjour a tous

voila mon probleme
quand je ferme mon programme, le processus ne se termine pas
voila le code


case SC_CLOSE : // cas d'un click sur la croix de fermeture
{
int quit = 0;
quit = MessageBox(hWnd,"Vous voulez réellement Quitter",
szClassName,MB_YESNO|MB_ICONQUESTION);

if (quit == IDNO) {return 0; break;}


SendMessage( hWnd, WM_CLOSE, 0, 0);
break;
}


...

...

case WM_CLOSE:
{
DestroyMenu(hMenu);
DestroyWindow( hWnd );
break;
}


case WM_DESTROY:
{
PostQuitMessage (0); // (Voir partie 1)
break;
}

26 réponses

cali70 Messages postés 71 Date d'inscription mercredi 29 septembre 2004 Statut Membre Dernière intervention 19 mars 2008
27 juil. 2005 à 19:38
Je ne suis pas chez moi et je ne peux donc pas tester le code :(.
Ca à l'air correct, du moins ce que j'ai regardé, c'est surement un petit truc tout con.
Vu que sa patauge, je vais proposer autre chose à tout hasard.

dans while(GetMessage(&messages, hWnd, 0, 0)), si tu remplaces hWnd par NULL, ca change quelque chose ?
3
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 12
27 juil. 2005 à 20:07
Par contre, tu avais bien vu juste: il faut écrire
while(GetMessage(&messages, 0, 0, 0))
Ce n'était pas une erreur si 'bete' que ca
3
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 12
26 juil. 2005 à 20:40
WM_CLOSE, et SC_CLOSE sont-ils suivis d'un DefWindowProc à la fin du switch?
0
kyript Messages postés 346 Date d'inscription jeudi 7 avril 2005 Statut Membre Dernière intervention 26 mars 2012
26 juil. 2005 à 20:42
oui voila tout le code




case WM_SYSCOMMAND :
{


switch (wParam)
{
case SC_CLOSE : // cas d'un click sur la croix de fermeture
{
int quit = 0;
quit = MessageBox(hWnd,"Vous voulez réellement Quitter",
szClassName,MB_YESNO|MB_ICONQUESTION);

if (quit == IDNO) {return 0; break;}


SendMessage( hWnd, WM_CLOSE, 0, 0);
break;
} // fin case SC_CLOSE

default : // on renvoie tous les autres messages système à
// windows selon la procédure normale.


{return DefWindowProc (hWnd, messages, wParam, lParam);break;}

}// fin switch (wParam)

break;
}


case WM_CLOSE: // -------------------------------------------------------
{
DestroyMenu(hMenu);
DestroyWindow( hWnd );
break;
} // fin case WM_CLOSE --------------------------------------------------


case WM_DESTROY:
{
PostQuitMessage (0); // (Voir partie 1)
break;
} // fin case WM_DESTROY ----------------------------------------------


default: // (Voir partie 1)
return DefWindowProc (hWnd, messages, wParam, lParam);
break;
} //fin de switch
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 12
26 juil. 2005 à 21:04
Quand tu recois WM_CLOSE, tu dois appeler DefWindowproc, sinon WM_DESTROY ne sera pas recu. Ou plus simplement, tu mets un PostQuitMessage dans le WM_CLOSE
0
kyript Messages postés 346 Date d'inscription jeudi 7 avril 2005 Statut Membre Dernière intervention 26 mars 2012
26 juil. 2005 à 21:11
comment ca ?


j'ai mis PostQuitMessage(0)

dans WM_CLOSE

et tjrs pareille , le processus ne se coupe pas
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 12
26 juil. 2005 à 21:16
Oui, en plus j'avais pas vu mais t'a mis un DestroyWindow donc WM_DESTROY sera bien recu
Ca vient peut être de ta boucle de messages, comment est-elle?
Sinon tu peux essayer de mettre une ExitProcess(0) à la fin de ton prog, mais normalement c'est pas nécessaire
0
kyript Messages postés 346 Date d'inscription jeudi 7 avril 2005 Statut Membre Dernière intervention 26 mars 2012
26 juil. 2005 à 23:33
bon je te laisse tou le programme car la je suis un peu perdu
car sur un programme que j'ai dans le meme style ben le processus ce ferme bien
voila le code



LRESULT CALLBACK WindowProc(HWND hWnd, UINT messages, WPARAM wParam, LPARAM lParam)
{
HDC hDc; //handle sur le device context
RECT rc; // on créer un objert de la structure rect;
PAINTSTRUCT ps; // On Déclare un objet de structure PAINTSTRUCT, qui va nous servir
// à contenir les informations pour l'écriture dans le
// contexte d'affichage.

switch (messages)
{
case WM_CREATE:
{

hCouleur = CreateSolidBrush(RGB(255,255,255)); // blanc

Police = "Arial";

break;
}
case WM_PAINT:
{
hDc = BeginPaint(hWnd, &ps);
GetClientRect(hWnd, &rc);

SetBkMode(hDc, TRANSPARENT);
SetBkColor(hDc,0x00FFFF00); // Bleu
SetTextColor(hDc, 0x000000FF); // rouge

HFONT MaPolice; // On déclare un handle sur une fonte.

MaPolice = CreateFont(nHauteur_Caractere,nLargeur_Caractere,
nOrientation_Caractere,0,
500,false,false,false,0,
OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS,
DEFAULT_QUALITY,DEFAULT_PITCH | FF_DONTCARE,
Police_Utile);

SelectObject(hDc, MaPolice);


SetTextColor(hDc, 0x005C03BE);

DrawText(hDc, "Bienvenue sur le serveur. v1.0", -1, &rc,
DT_SINGLELINE|DT_LEFT |DT_TOP);


DeleteObject(MaPolice);
EndPaint(hWnd, &ps);
break;
}
case WM_COMMAND:
{
switch (LOWORD(wParam))
{
case IDM_VEILLE:
{
SendMessage(hWnd,WM_SYSCOMMAND,SC_SCREENSAVE,0);
break;
}
case IDM_QUITTER:
{
int quit = 0; // Pour récupérer la réponse de l'utilisateur.

quit = MessageBox(hWnd,"Vous voulez réellement Quitter",
szClassName,MB_YESNO|MB_ICONQUESTION);

if (quit == IDNO)
{
return 0;
break;
}
else
{
SendMessage( hWnd, WM_CLOSE, 0, 0L);
break;
}
break;
}
break;
} // fin switch
} // WS_COMMAND
case WM_SYSCOMMAND :
{


switch (wParam)
{
case SC_CLOSE : // cas d'un click sur la croix de fermeture
{
int quit = 0;
quit = MessageBox(hWnd,"Vous voulez réellement Quitter",
szClassName,MB_YESNO|MB_ICONQUESTION);

if (quit == IDNO) {return 0; break;}


SendMessage( hWnd, WM_CLOSE, 0, 0);
break;
} // fin case SC_CLOSE

default : // on renvoie tous les autres messages système à
// windows selon la procédure normale.


{return DefWindowProc (hWnd, messages, wParam, lParam);break;}

}// fin switch (wParam)

break;
}


case WM_CLOSE: // -------------------------------------------------------
{
DestroyMenu(hMenu);
DestroyWindow( hWnd );

break;
} // fin case WM_CLOSE --------------------------------------------------


case WM_DESTROY:
{
PostQuitMessage (0); // (Voir partie 1)
break;
} // fin case WM_DESTROY ----------------------------------------------


default: // (Voir partie 1)
return DefWindowProc (hWnd, messages, wParam, lParam);
break;
} //fin de switch
return 0;
}
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 12
27 juil. 2005 à 04:03
Ya pas tout ton programme la. Je parlais de la boucle des messages qui est dans le WinMain
0
kyript Messages postés 346 Date d'inscription jeudi 7 avril 2005 Statut Membre Dernière intervention 26 mars 2012
27 juil. 2005 à 10:35
a ouai bon cete fois si je met tout le winmain()



#include <windows.h>
#include <math.h>
#include "Tutor_Win_32_Part_3a.h"

LRESULT CALLBACK WindowProc(HWND, UINT, WPARAM, LPARAM);


HWND hWnd;
HMENU hMenu;
HMENU hMenu_Raccourci; // Declaration handle menu
// pour la fonction TrackPopupMenu

HBRUSH hCouleur;
char* Police;

const HBRUSH hCouleur_Blanc = CreateSolidBrush(RGB(255,255,255));

HBRUSH hBackground = hCouleur_Blanc ;


static char szClassName[ ] = "Fenêtre Windows";

static int nSelection = IDM_BLANC;

static int nHauteur_Caractere = 20;
static int nLargeur_Caractere = 10;
static int nOrientation_Caractere = 0;
static char* Police_Utile = "Arial";



int WINAPI WinMain( HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpszCmdLine,
int nCmdShow )
{


WNDCLASSEX wndClassex;

wndClassex.cbSize = sizeof(WNDCLASSEX);
wndClassex.style = CS_HREDRAW | CS_VREDRAW;
wndClassex.lpfnWndProc = WindowProc;
wndClassex.cbClsExtra = 0;
wndClassex.cbWndExtra = 0;
wndClassex.hInstance = hInstance;
wndClassex.hIcon = NULL;
wndClassex.hCursor = NULL;
wndClassex.hbrBackground = hBackground;
wndClassex.lpszMenuName = NULL;
wndClassex.lpszClassName = szClassName;
wndClassex.hIconSm = NULL;

if (!RegisterClassEx(&wndClassex))
{
MessageBeep(0xFFFFFFFF | MB_ICONASTERISK);
MessageBox(hWnd, "Classe non enregistrer", "Probleme", MB_OK);
return 0;
}


hWnd = CreateWindowEx(0,
szClassName,
"Bientot un serveur",
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
HWND_DESKTOP,
NULL,
hInstance,
NULL );
ShowWindow(hWnd, SW_SHOW);

hMenu = LoadMenu(hInstance, "Menu");

SetMenu(hWnd, hMenu);

UpdateWindow(hWnd);

MSG messages;


while(GetMessage(&messages, hWnd, 0, 0))
{
DispatchMessage(&messages);
TranslateMessage(&messages);
}
return messages.wParam;
}
0
cali70 Messages postés 71 Date d'inscription mercredi 29 septembre 2004 Statut Membre Dernière intervention 19 mars 2008
27 juil. 2005 à 18:42
Je vais peu être dire une connerie je sais pas mais si t'éssayais de de mettre le translatemessage avant le dispatchmessage.... peu être que ca irrait mieux...
0
kyript Messages postés 346 Date d'inscription jeudi 7 avril 2005 Statut Membre Dernière intervention 26 mars 2012
27 juil. 2005 à 19:25
ben non ca marche pas non plus
0
cali70 Messages postés 71 Date d'inscription mercredi 29 septembre 2004 Statut Membre Dernière intervention 19 mars 2008
27 juil. 2005 à 19:44
Et aussi... définis ta variable messages (MSG messages) juste après le winmain ca me parait plus prudent que de la déclarer si tard dans le programme.

int WINAPI WinMain( HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpszCmdLine,
int nCmdShow )
{
MSG messages;
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 12
27 juil. 2005 à 19:59
C'est qu'il faut être vraiment très prudent alors, je vois pas ce que ca pourrait changer
0
cali70 Messages postés 71 Date d'inscription mercredi 29 septembre 2004 Statut Membre Dernière intervention 19 mars 2008
27 juil. 2005 à 20:01
J'ai pas bcp de moyen à ma disposition présentement pour tester donc je propose ce que je peux pour aider... Et je pense que tu ne me contrediras pas quand je dis que parfois les solutions en programmation sont les plus "stupide"...
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 12
27 juil. 2005 à 20:03
Oui mais en l'occurence avoue que ca ne peut pas venir de la...
0
cali70 Messages postés 71 Date d'inscription mercredi 29 septembre 2004 Statut Membre Dernière intervention 19 mars 2008
27 juil. 2005 à 20:07
J'avoue oui, son problème ne peut pas venir de ca, je ne disais pas prudent dans le sens "ca peut provoquer des erreur" sinon le reste de ma remarque pour les solutions "stupides" c'était pour le NULL à la place du hWnd (j'ai pas été très clair et je m'en excuse).
0
cali70 Messages postés 71 Date d'inscription mercredi 29 septembre 2004 Statut Membre Dernière intervention 19 mars 2008
27 juil. 2005 à 20:09
Merci du renseigement j'ai pas pû tester comme je l'ai dis plus haut (0 ou NULL c pareil)
0
kyript Messages postés 346 Date d'inscription jeudi 7 avril 2005 Statut Membre Dernière intervention 26 mars 2012
28 juil. 2005 à 11:19
bon ben vr
0
kyript Messages postés 346 Date d'inscription jeudi 7 avril 2005 Statut Membre Dernière intervention 26 mars 2012
28 juil. 2005 à 11:19
bon ben vr
0