НЕ препятствуйте тому, чтобы окна закрывали OnCloseQuery - PullRequest
4 голосов
/ 07 июля 2011

У меня есть приложение, которое скрывается при закрытии красным крестом.Пользователь может выйти из него, щелкнув правой кнопкой мыши значок в трее и выбрав Выход.Но это, очевидно, заблокировало бы закрытие окон, поэтому я сделал процедуру, чтобы ответить на WM_QUERYENDSESSION, чтобы разрешить закрытие, вот соответствующий код:

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;

Но странная вещь продолжает происходить.Когда я выполняю завершение работы, это приложение красиво закрывается.Но это все.Когда я выполняю второе выключение, система выходит нормально.(Я проверяю это в WinXP).

В чем может быть причина?Спасибо


ОТВЕТ Код должен выглядеть следующим образом

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;

1 Ответ

9 голосов
/ 07 июля 2011

WM_QUERYENDSESSION - это «запрос», а не команда выключения: Windows спрашивает, все ли у вас в порядке с выключением, не просит выключить.Вы не должны звонить Close!

Во-вторых, Windows ожидает, что вы вернете TRUE при обработке этого сообщения, поэтому она знает, что вы в порядке с возможным завершением работы.Я предполагаю, что вы не устанавливаете результат в значение TRUE, поэтому Windows прерывает первый запрос на завершение работы.

...