You can use the following procedure to detect if Windows is shutting down. If your application needs to save data before allowing the shutdown to continue you can do that, then allow Windows to shutdown normally.
procedure TfrmMain.WMQueryEndSession(var Message :
TWMQueryEndSession);
begin
// Let the inherited message handler respond first
inherited;
if DataHasChanged then begin
MessageBeep(MB_ICONQUESTION);
case MessageDlg('The current Windows
session is ending. Save league changes?',
mtConfirmation, [mbYes,mbNo,mbCancel],0) of
mrYes : begin
//Your data-saving code or method
//call goes here
Message.Result := 1;
end;
mrNo : Message.Result := 1;
mrCancel : Message.Result := 0;
end; {case} end
else
Message.Result := 1;
end;