How to detect and prevent Windows shut down #185

When Windows is about to shut down, it sends a WM_QUERYENDSESSION message to all open applications. To detect (and prevent shutdown), we must define a message handler for this message. Put this definition in the private section of the main form:

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

Also, to prevent Windows shutting down put this method in the implementation section of the unit:

procedure TForm1.WMQueryEndSession(var Msg: TWMQueryEndSession);
begin
  if MessageDlg('Close Windows ?', mtConfirmation, [mbYes,mbNo], 0) = mrNo then
    Msg.Result := 0
  else
    Msg.Result := 1 ;
end;

To detect Windows Shutdown, we must trap the WM_ENDSESSION message. Declare a message handling procedure in your main frm's private section:

procedure WMEndSession(var Msg: TWMEndSession); message WM_ENDSESSION;

Also, add the following procedure to the implementation section of your unit:

procedure TForm1.WMEndSession(var Msg: TWMEndSession);
begin
  if Msg.EndSession = True then
    ShowMessage(
      'Windows is shutting down ' + #10#13 + 'at ' + FormatDateTime('c', Now)
    );
  inherited;
end;
Author: Unknown
Contributor: Riccardo Faiella (Topellina)
Added: 2012/07/06
Last updated: 2012/07/06