Как определить, что моё приложение хотят завершить

объявляем следующию процедуру как:

procedure WMQueryEndSession( var Message: TWMQueryEndSession); message WM_QUERYENDSESSION;

и определяем её как:

procedure TMainFrm.WMQueryEndSession(var Message: TWMQueryEndSession); 
begin 
  Message.Result:=1; 
  gEndSession := True; 
end; 

она будет вызываться, когда Windows пожелает завершиться. Хотя обычно такая процедура вызывается как:

procedure TMainFrm.FormCloseQuery(Sender: TObject; var CanClose: Boolean); 
begin 
CanClose := True; 
  if gQueryEnd and not gEndSession then 
    if MessageDlg('Quitting (your app name).  Are you sure?', 
                  mtInformation, mbOKCancel, 0) = mrCancel then CanClose := False 
end;