Wenn Windows heruntergefahren/abgemeldet wird und ich es richtig verstanden habe ist die Reihenfolge so:
- WM_QUERYENDSESSION wird an die Anwendung gesendet
- Das löst das OnCloseQuery-Event des VCL-Formulars aus
- WM_ENDSESSION wird an die Anwendung gesendet um den unausweichlichen Shutdown zu verkünden
In der
Doku zu WM_ENDSESSION steht dass dort (im WPARAM) angegeben wird ob denn nun abgemeldet wird oder sich der Benutzer umentschieden hat:
Zitat:
If the session is being ended, this parameter is TRUE; the session can end any time after all applications have returned from processing this message. Otherwise, it is FALSE.
Meine Testanwendung enthält folgenden Message-Handler:
Delphi-Quellcode:
procedure TForm1.WMEndSession(var Message: TWMEndSession);
begin
ShuttingDown := Message.EndSession;
//(Logge "ShuttingDown" in eine Textdatei)
inherited;
end;
Ich starte meine Testanwendung, mache Notepad auf und tippe darin ein paar Buchstaben. Somit wird Windows am Herunterfahren gehindert da mich Notepad noch fragen wird ob ich denn nicht lieber speichern möchte.
Ich gehe auf Herunterfahren, bekomme den "Folgende Anwendungen verhindern das Herunterfahren"-Dialog und sage "Abbrechen".
Meine Anwendung hat den Erhalt der WM_ENDSESSION-Nachricht ordnungsgemäß protokolliert und meint, ShuttingDown sei
True
gewesen. Wie kann das sein? Es hätte doch
False
sein müssen. Wenn wirklich heruntergefahren wird,
wird auch True
protokolliert.
Irgendwas kann da nicht stimmen