Terminer un processus

[Résolu]
Signaler
Messages postés
346
Date d'inscription
jeudi 7 avril 2005
Statut
Membre
Dernière intervention
26 mars 2012
-
Messages postés
346
Date d'inscription
jeudi 7 avril 2005
Statut
Membre
Dernière intervention
26 mars 2012
-
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

Messages postés
71
Date d'inscription
mercredi 29 septembre 2004
Statut
Membre
Dernière intervention
19 mars 2008

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 ?
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
9
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
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
9
WM_CLOSE, et SC_CLOSE sont-ils suivis d'un DefWindowProc à la fin du switch?
Messages postés
346
Date d'inscription
jeudi 7 avril 2005
Statut
Membre
Dernière intervention
26 mars 2012

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
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
9
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
Messages postés
346
Date d'inscription
jeudi 7 avril 2005
Statut
Membre
Dernière intervention
26 mars 2012

comment ca ?


j'ai mis PostQuitMessage(0)

dans WM_CLOSE

et tjrs pareille , le processus ne se coupe pas
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
9
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
Messages postés
346
Date d'inscription
jeudi 7 avril 2005
Statut
Membre
Dernière intervention
26 mars 2012

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;
}
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
9
Ya pas tout ton programme la. Je parlais de la boucle des messages qui est dans le WinMain
Messages postés
346
Date d'inscription
jeudi 7 avril 2005
Statut
Membre
Dernière intervention
26 mars 2012

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;
}
Messages postés
71
Date d'inscription
mercredi 29 septembre 2004
Statut
Membre
Dernière intervention
19 mars 2008

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...
Messages postés
346
Date d'inscription
jeudi 7 avril 2005
Statut
Membre
Dernière intervention
26 mars 2012

ben non ca marche pas non plus
Messages postés
71
Date d'inscription
mercredi 29 septembre 2004
Statut
Membre
Dernière intervention
19 mars 2008

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;
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
9
C'est qu'il faut être vraiment très prudent alors, je vois pas ce que ca pourrait changer
Messages postés
71
Date d'inscription
mercredi 29 septembre 2004
Statut
Membre
Dernière intervention
19 mars 2008

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"...
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
9
Oui mais en l'occurence avoue que ca ne peut pas venir de la...
Messages postés
71
Date d'inscription
mercredi 29 septembre 2004
Statut
Membre
Dernière intervention
19 mars 2008

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).
Messages postés
71
Date d'inscription
mercredi 29 septembre 2004
Statut
Membre
Dernière intervention
19 mars 2008

Merci du renseigement j'ai pas pû tester comme je l'ai dis plus haut (0 ou NULL c pareil)
Messages postés
346
Date d'inscription
jeudi 7 avril 2005
Statut
Membre
Dernière intervention
26 mars 2012

bon ben vr
Messages postés
346
Date d'inscription
jeudi 7 avril 2005
Statut
Membre
Dernière intervention
26 mars 2012

bon ben vr