N’empêche PAS Windows de fermer OnCloseQuery

J’ai une application qui se cache à la fermeture par la croix rouge. L’utilisateur peut le quitter en cliquant avec le bouton droit de la souris sur l’icône de la barre et en sélectionnant Quitter. Mais cela bloquerait apparemment l’arrêt des fenêtres, alors j’ai fait une procédure pour répondre à une WM_QUERYENDSESSION pour permettre la fermeture, c’est le code approprié:

procedure TMainForm.OnWindowsEnd(var Msg: TMessage); // responds to message WM_QUERYENDSESSION; begin AllowClose:=true; Close; end; procedure TMainForm.FormCloseQuery(Sender: TObject; var CanClose: Boolean); begin CanClose:=AllowClose; if NOt AllowClose then Hide; end; 

Mais une chose étrange continue de se produire. Lorsque je lance un arrêt, cette application se ferme parfaitement. Mais c’est tout. Lorsque j’émets un deuxième arrêt, le système se ferme correctement. (Je teste cela dans WinXP).

Quelle peut être la cause? Je vous remercie


RÉPONSE Code devrait ressembler à ceci

 procedure TMainForm.OnWindowsEnd(var Msg: TMessage); // responds to message WM_ENDSESSION; begin // Possible checking for flags, see http://msdn.microsoft.com/en-us/library/aa376889%28v=vs.85%29.aspx AllowClose:=true; Msg.Result:=1; end; procedure TMainForm.FormCloseQuery(Sender: TObject; var CanClose: Boolean); begin CanClose:=AllowClose; if NOt AllowClose then Hide; end; 

WM_QUERYENDSESSION est une “requête”, pas une commande d’arrêt: Windows vous demande si vous êtes d’accord avec la fermeture, ne vous demande pas d’arrêter. Vous ne devriez pas appeler Close !

Deuxièmement, Windows s’attend à ce que vous retourniez VRAI lors du traitement de ce message, donc il sait que vous êtes en accord avec un potentiel d’arrêt. Je suppose que vous ne définissez pas le résultat sur TRUE, Windows annule donc la première demande d’arrêt.