Aurel184
Messages postés21Date d'inscriptiondimanche 14 mars 2004StatutMembreDernière intervention 9 juin 2010
-
20 avril 2009 à 16:33
Bacterius
Messages postés3792Date d'inscriptionsamedi 22 décembre 2007StatutMembreDernière intervention 3 juin 2016
-
21 avril 2009 à 12:32
Bonjour,
j'ai réalisé une petite application qui me sert à dialoguer avec des vidéo-projecteurs. Cette application créé donc des connexions socket.
Mon problème est que mon application empêche Windows de se fermer. Je peux sans problème fermer mon programme avec la croix rouge, Alt+F4, fin de tâche...
Mais lorsque que ferme Windows alors que mon programme tourne, l'extinction s'arrête quand Windows essaie de fermer mon programme.
Les fonction OnClose et OncloseQuery ne sont pas implémentées dans mon soft... donc je vois pas ce qui peut coincer.
Je cherche depuis déjà pas mal de temps. Et le problème est que je peux pas utiliser le debugger... puisque quand je ferme Windows, ce dernier ferme le debugger avant d'arrêter son processus d'extinction :p
Aurel184
Messages postés21Date d'inscriptiondimanche 14 mars 2004StatutMembreDernière intervention 9 juin 20101 21 avril 2009 à 11:06
De plus en plus étrange... J'ai essayé de choper le message WM_QUERYENDSESSION :
public
procedure WMQUERYENDSESSION(var Message: TMessage); message WM_QUERYENDSESSION;
...
procedure TForm1.WMQUERYENDSESSION(var Message: TMessage);
begin
inherited;
showmessage('Fin de session !!');
Message.Result := 1;
end;
fonction jamais appelée... je suis très étonné... J'ai peut être un composant qui intercepte le message... Pourtant j'ai rien de particulier sur ma fiche
Bacterius
Messages postés3792Date d'inscriptionsamedi 22 décembre 2007StatutMembreDernière intervention 3 juin 201610 21 avril 2009 à 00:36
Etrange, j'ai moi-même eu ce problème il y a quelques temps, essaye de choper le message comme ceci (mets un ShowMessage ou WriteLn pour voir si le message est bien reçu) :
public
procedure WMQUERYENDSESSION(var Message: TMessage); message WM_QUERYENDSESSION;
...
procedure TForm1.WMQUERYENDSESSION(var Message: TMessage); message WM_QUERYENDSESSION;
begin
Message.Result := 1; // Toujours répondre 1 à ce message !
end;
Aurel184
Messages postés21Date d'inscriptiondimanche 14 mars 2004StatutMembreDernière intervention 9 juin 20101 21 avril 2009 à 11:38
ok, mon Windows faisait du caca. surement qu'après un grand nombre de demande d'arrêt manqué, il ne s'arrêtait plus, même sans soft de lancé. J'ai redémarré mon PC et maintenant j'ai bien la boite de dialogue qui s'affiche... Mais mon soft ne s'arrête quand même pas.
Je vais tenter d'arrêter mon application dans la fonction WMQUERYENDSESSION
Vous n’avez pas trouvé la réponse que vous recherchez ?
Bacterius
Messages postés3792Date d'inscriptionsamedi 22 décembre 2007StatutMembreDernière intervention 3 juin 201610 21 avril 2009 à 12:32
Non !
Je t'explique le principe :
Windows, quand l'utilisateur veut arrêter, envoie un message WM_QUERYENDSESSION à chaque fenêtre 1 par 1. Deux cas se présentent :
- Une (une seule suffit) fenêtre répond NON (0) et Windows arrête d'émettre ces messages, et l'extinction est annulée.
- Aucune fenêtre ne répond NON (ce qui signifie implicitement que toutes les fenêtres répondent OUI), et Windows envoie alors à chaque fenêtre le message WM_ENDSESSION, qui indique que là, il faut absolument arrêter, le processus d'extinction est irréversible.
Donc, WM_QUERYENDSESSION => On peut encore annuler l'extinction.
Et, WM_ENDSESSION => Impossible d'annuler l'extinction.
C'est donc dans WM_ENDSESSION qu'il faut fermer son application, vu que dans WM_QUERYENDSESSION, il y a une chance que des applications autres que la tienne bloquent la fermeture (répondent NON à WM_QUERYENDSESSION), et là, si tu fermes ton app. dans ce message, et que Windows décide de l'envoyer à ta fenêtre avant celle qui dit NON, ton application sera fermée, mais l'extinction sera annulée.
Tu vois le hic ?
Donc fermes application dans WM_ENDSESSION.