Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

NOT prevent windows from shutting down OnCloseQuery

I have an application that hides itself on closing by the red cross. User can exit it by right-clicking tray icon and choosing Exit. But it would apparently block windows from shutting down, so I made a procedure to respond to a WM_QUERYENDSESSION to enable closing, this is the relevant code:

procedure TMainForm.OnWindowsEnd(var Msg: TMessage); // responds to message WM_QUERYENDSESSION;
begin
  AllowClose:=true;
  Close;
end;

procedure TMainForm.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
  CanClose:=AllowClose;
  if NOt AllowClose then
    Hide;
end;

But weird thing keeps happening. When I issue a shutdown, this application closes nicely. But that is all. When I issue a second shutdown, system quits fine. (I'm testing this in WinXP).

What can be the cause? Thank you


ANSWER Code should look like this

procedure TMainForm.OnWindowsEnd(var Msg: TMessage); // responds to message WM_ENDSESSION;
begin
  // Possible checking for flags, see http://msdn.microsoft.com/en-us/library/aa376889%28v=vs.85%29.aspx
  AllowClose:=true;
  Msg.Result:=1;
end;

procedure TMainForm.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
  CanClose:=AllowClose;
  if NOt AllowClose then
    Hide;
end;
like image 318
Martin Melka Avatar asked Jan 19 '23 07:01

Martin Melka


1 Answers

WM_QUERYENDSESSION is a "query", not a shutdown command: Windows asks you if you're OK with shutting down, doesn't ask you to shut down. You shouldn't call Close!

Secondly Windows expects you to return TRUE when processing that message, so it knows you're OK with a potential Shut Down. I assume you're not setting the result to something TRUE, so Windows aborts the first Shut Down request.

like image 149
Cosmin Prund Avatar answered Jan 28 '23 18:01

Cosmin Prund