Auch Close solltest du an dieser Stelle nicht aufrufen.
Windows hat noch nicht entschieden ob es beendet wird.
Es fragt alle Fenster ab und wenn auch nur eins mit 0 antwortet, passiert nichts.
Das ist die Standardantwort die jedes Fenster zurückgibt:
Delphi-Quellcode:
begin
Msg.Result := 1;
end;
Das einzige sinnvolle andere Reaktion ist Result auf 0 zu setzen und/oder sich dieses Ereignis zu merken.
Der von Helmi gepostete Code gehört eigentlich in die Verarbeitung der Nachricht WM_EndSession.
Wenn deine Methode WMQueryEndSession entfernt wird und sich Windows trotzdem nicht beenden lässt, dann reagiert irgend ein anderes Fenster deiner Anwendung falsch auf diese Nachricht. Das kann auch ein unsichtbares Fenster sein, das z.B. von irgend einer Komponente/Klasse für interne Zwecke erzeugt wurde.