Se l'evento OnCloseQuery
viene attivato in risposta ad un messaggio WM_QUERYENDSESSION
, impostando CanClose=False
farà sì che il messaggio per tornare FALSE
.
Su XP e precedenti, questo annullerà l'arresto di Windows. Fino a quel momento, qualsiasi app che aveva ricevuto un messaggio WM_QUERYENDSESSION
riceverà un messaggio WM_ENDSESSION
con il suo valore wParam
impostato su FALSE
che dice a quelle applicazioni NON di terminarsi. Questo è il motivo per cui la tua app va nel vassoio e non esce durante l'arresto di Windows.
Microsoft ha modificato questo comportamento in Windows Vista in modo che le app non possano più annullare l'arresto di Windows tramite WM_QUERYENDSESSION
. Questo è il motivo per cui Windows Vista e versioni successive interromperanno la tua app. È stata introdotta un'intera nuova API se un'applicazione deve interrompere l'arresto di Windows di proposito.
Questo è documentato su MSDN:
Application Shutdown Changes in Windows Vista
Per fare che cosa state chiedendo, è necessario intercettare direttamente il messaggio WM_QUERYENDSESSION
modo da poter determinare se OnCloseQuery
è chiamata a causa di arresto di Windows oppure no. Per esempio:
type
TForm1 = class(TForm)
private
procedure WMQueryEndSession(var Message: TWMQueryEndSession); message WM_QUERYENDSESSION;
procedure WMEndSession(var Message: TWMEndSession); message WM_ENDSESSION;
end;
var
ShuttingDown: Boolean = False;
procedure TForm1.WMQueryEndSession(var Message: TWMQueryEndSession);
begin
ShuttingDown := True;
inherited;
end;
procedure TForm1.WMEndSession(var Message: TWMEndSession);
begin
ShuttingDown := Message.EndSession;
inherited;
end;
procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
CanClose := ShuttingDown;
if not ShuttingDown then
begin
// your Tray logic here ...
end;
end;
fonte
2012-05-24 22:07:54
Sei provato intrappolando il messaggio [ 'WM_QUERYENDSESSION'] (http://msdn.microsoft.com/en-us/library/aa376890%28VS.85%29.aspx)? – RRUZ
Ho spostato il mio commento a una risposta. –