Mon application empêche Windows de se fermer

Aurel184 Messages postés 21 Date d'inscription dimanche 14 mars 2004 Statut Membre Dernière intervention 9 juin 2010 - 20 avril 2009 à 16:33
Bacterius Messages postés 3792 Date d'inscription samedi 22 décembre 2007 Statut Membre Derniè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

Merci d'avance pour votre aide

5 réponses

Aurel184 Messages postés 21 Date d'inscription dimanche 14 mars 2004 Statut Membre Dernière intervention 9 juin 2010 1
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
1
cs_rt15 Messages postés 3874 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 7 novembre 2014 13
20 avril 2009 à 19:39
Salut,

Curieux...

Tu peux peut être demander à ton application de se fermer elle même lors de la fermeture de la session. En attendant ce message.
0
Bacterius Messages postés 3792 Date d'inscription samedi 22 décembre 2007 Statut Membre Dernière intervention 3 juin 2016 10
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;

Cordialement, Bacterius !
0
Aurel184 Messages postés 21 Date d'inscription dimanche 14 mars 2004 Statut Membre Dernière intervention 9 juin 2010 1
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
0

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

Posez votre question
Bacterius Messages postés 3792 Date d'inscription samedi 22 décembre 2007 Statut Membre Dernière intervention 3 juin 2016 10
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.

Cordialement, Bacterius !
0
Rejoignez-nous