【问题标题】:NOT prevent windows from shutting down OnCloseQuery不阻止 Windows 关闭 OnCloseQuery
【发布时间】:2011-07-07 11:33:08
【问题描述】:

我有一个应用程序在被红十字关闭时隐藏起来。用户可以通过右键单击托盘图标并选择退出来退出它。但它显然会阻止窗口关闭,所以我做了一个程序来响应 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;

【问题讨论】:

    标签: windows delphi system-shutdown


    【解决方案1】:

    WM_QUERYENDSESSION 是“查询”,而不是关闭命令:Windows 会询问您是否可以关闭,而不是要求您关闭。你不应该打电话给Close

    其次,Windows 希望您在处理该消息时返回 TRUE,因此它知道您可以接受潜在的 Shut Down。我假设您没有将结果设置为 TRUE,因此 Windows 中止了第一个 Shut Down 请求。

    【讨论】:

    • 啊我忘了提到我尝试了 WM_ENDSESSION 和 WM_QUERYENDSESSION (根据 MSDN,这两个与关闭 Windows 有关)。会试试的。
    • 好吧,现在我发现自己又傻了。我在 MSDN 上阅读了 Shutting Down 的描述,并在那里进行了解释,但在处理消息时,我不知道如何“返回 TRUE”。你能帮我解决这个问题吗?
    • 在您的消息处理程序中,执行msg.Result := 1。 True 是任何不为 0 的东西。
    猜你喜欢
    • 1970-01-01
    • 2010-12-28
    • 2014-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多