Fermer proprement un programme qd windows se ferme [Résolu]

Signaler
Messages postés
706
Date d'inscription
mardi 30 décembre 2003
Statut
Membre
Dernière intervention
27 janvier 2009
-
Messages postés
203
Date d'inscription
lundi 2 août 2004
Statut
Membre
Dernière intervention
8 septembre 2006
-
bonjour,

comment faire pour qu'une application se termine proprement (cad en lui
faisant executer le code que l'on veut) quand windows se ferme?

un message est-il envoyé à tous les programmes ... ? dans ce cas comment l'interpreter?



merci

30 réponses

Messages postés
706
Date d'inscription
mardi 30 décembre 2003
Statut
Membre
Dernière intervention
27 janvier 2009
4
donc mieux vaut mettre le code de terminaison dans le WM_ENDSESSION, non??
Messages postés
203
Date d'inscription
lundi 2 août 2004
Statut
Membre
Dernière intervention
8 septembre 2006

oui un message est envoyé a tous les programmes leur demandant de se fermer. Ca c'est une certitude. Par contre si je connais tres bien windows, je connais moins bien le c par contre, mais il me semble que le vontol qui est envoyé au prog est le même que celui qui est adresse lorsque tu clic sur la croi, pour fermer la fenetre. Donc tu a rien de plus à faire puisque normalement tu a éjà traiter ce msg dans la boucle de traitement et c'es le même

D'autre te confirmeront pour le msg qui est posté lorsque que tu ferme windows, et en meme tps je m'instrurais

Bon courrage.
Messages postés
706
Date d'inscription
mardi 30 décembre 2003
Statut
Membre
Dernière intervention
27 janvier 2009
4
salut,

non c'est pas le message la, j'avais déja testé. (en mettant un
messagebox qd on clique sur la croix, ca s'affichait pas qd on ferme
windows).



en fait j'ai trouvé par moi meme, windows envoie WM_QUERYENDSESSION et
la fenetre doit alors retourner 0 pour dire qu'elle traite ce message.

c'etait chiant pour tester, obliger de rebooter a chaque fois ...

a++
Messages postés
933
Date d'inscription
dimanche 1 avril 2001
Statut
Modérateur
Dernière intervention
9 janvier 2012
1
WM_DESTROY

@+
Arnotic,
Admin CS, MVP Visual C++
Messages postés
706
Date d'inscription
mardi 30 décembre 2003
Statut
Membre
Dernière intervention
27 janvier 2009
4
quoi WM_DESTROY ? a ce que j'ai compris c'est WM_ENDSESSION qui est
envoyé. Si quelqu'un pige prquoi ya WM_QUERYENDSESSION qui est envoyé
avant, ca serait bien de l'expliquer ici.

merci
Messages postés
933
Date d'inscription
dimanche 1 avril 2001
Statut
Modérateur
Dernière intervention
9 janvier 2012
1
dans WM_DESTROY on y passe forcement aussi.

@+
Arnotic,
Admin CS, MVP Visual C++
Messages postés
706
Date d'inscription
mardi 30 décembre 2003
Statut
Membre
Dernière intervention
27 janvier 2009
4
et bien non. je viens de tester, j'y passe ni a la fermeture normale du
prog, ni qd windows se ferme. WM_DESTROY est envoyé uniquement lors
d'un appel explicite à DestroyWindow.

alala...
Messages postés
203
Date d'inscription
lundi 2 août 2004
Statut
Membre
Dernière intervention
8 septembre 2006

pour faire tes test comme ca car effectivement rebooter la becanne tout le tps c'est gonflant, je te conseil vmware pour emuler des machines. Il existe en version d'evaluation limité ds le tps, qui peut te dépanner de tps en tps

Bon courrage.
Messages postés
203
Date d'inscription
lundi 2 août 2004
Statut
Membre
Dernière intervention
8 septembre 2006

Messages postés
1905
Date d'inscription
mercredi 22 janvier 2003
Statut
Membre
Dernière intervention
17 septembre 2012
2
Salut,
moi je comprend msdn comme ca:
- WM_QUERYENDSESSION: demande a l'app si la session peut se terminer (on peut retourner 0 pour empecher la fin de la session)
- WM_ENDSESSION: informe l'app que la session se termine, c'est la qu'il faut executer le code "pour quitter proprement".

à tester ...
Messages postés
706
Date d'inscription
mardi 30 décembre 2003
Statut
Membre
Dernière intervention
27 janvier 2009
4
ouais j'ai vu ca, mtnt j'ai retourné 0, et la session se ferme qd
meme.... donc ca doit ptet servir a avoir un dela supplementaire...

si quelqu'un s'en est déja servi avant et sait déja tout ca...
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
20
Le systeme se fout du retour de WM_ENDSESSION, executer le code de terminaison dans
WM_QUERYENDSESSION est le meilleur choix possible.

ciao...
BruNews, MVP VC++
Messages postés
706
Date d'inscription
mardi 30 décembre 2003
Statut
Membre
Dernière intervention
27 janvier 2009
4
ok, mais apres avoir lu msdn, est ce sur que WM_QUERYENDSESSION soit envoyé a tous les processus?? WM_ENDSESSION oui en tout cas
Messages postés
203
Date d'inscription
lundi 2 août 2004
Statut
Membre
Dernière intervention
8 septembre 2006

Pour moi il ne fait aucun doute que WM_QUERYENDSESSION est envoyé a toutes les applications, et que WM_ENDSESSION n'est envoyé qu'ensuite si et seulement si aucune application n'a retourné 0.

Bon courrage
Messages postés
706
Date d'inscription
mardi 30 décembre 2003
Statut
Membre
Dernière intervention
27 janvier 2009
4
pourtant msdn dit:

"The system stops sending WM_QUERYENDSESSION messages as soon as one application returns zero"

moi je comprends ca comme: il n'est pas sur que WM_QUERYENDSESSION soit
envoyé a tout le monde, mais je pense que dans le cas ou des programmes
ne le recoivent pas, alors le systeme ne va pas se fermer. Autrement
dit, on est sur que le systeme va se fermer quand on recoit
WM_ENDSESSION, donc mieux vaut peut etre plutot mettre le code de
terminaison dedans...

non ?? car une appli pourrait recevoir WM_QUERYENDSESSION sans que le
systeme ne se ferme (si une autre appli retourne 0; enfin chez moi j'ai
beau retourner 0 ca se ferme qd meme... ;)

qu'en pensez vous?
Messages postés
706
Date d'inscription
mardi 30 décembre 2003
Statut
Membre
Dernière intervention
27 janvier 2009
4
"When an application returns TRUE for this message, it receives the
WM_ENDSESSION message and it is terminated, regardless of how the other applications respond to the
WM_QUERYENDSESSION message.

Windows Me/98/95: After all applications return TRUE for this message, they receive the
WM_ENDSESSION and they are terminated."



ha ben en+ ca a l'air de dépendre du systeme.... sur Me/98/95 à ce que
je comprends, on ne recoit pas a coup sur un WM_ENDSESSION apres un
WM_QUERYENDSESSION alors que sur os superieur oui...

bon je mets ou le code de terminaison alors ?
Messages postés
706
Date d'inscription
mardi 30 décembre 2003
Statut
Membre
Dernière intervention
27 janvier 2009
4
brunews t'as pas écrit l'inverse de ce que tu voulais dire par hasard?? (permutation entre wm_endsession et wm_queryendsession)
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
20
WM_QUERYENDSESSION est envoyé aux progs alors que WM_ENDSESSION n'est jamais garanti, on est dependant de comment aura repondu un autre place devant dans la liste d'appels.

ciao...
BruNews, MVP VC++
Messages postés
706
Date d'inscription
mardi 30 décembre 2003
Statut
Membre
Dernière intervention
27 janvier 2009
4
est que l'application peut etre fermée si WM_ENDSESSION
n'est pas envoyée?? je crois que non (cela signifierait que windows ne
va finalement pas se fermer), par contre, l'application peut ne pas
etre fermée meme si
WM_QUERYENDSESSION est envoyée non ?

bref ...
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
20
tout à fait mon avis, si on retourne 0 sur WM_QUERYENDSESSION, on ne recevra pas 'normalement' de WM_ENDSESSION car Windows aura stoppé le processus de terminaison, à part si un sauvage appelle ExitWindowsEx avec EWX_FORCE.

ciao...
BruNews, MVP VC++