0

我的一个 Delphi XE2 程序在运行和空闲时“防止 Windows 关机”。我的大多数应用程序都不是这种情况,我需要解决它。在 XP 上,Windows 静默无法关闭;在 Win7 上,对话框显示我的应用程序阻止关机。

与这里的类似问题不同,该程序是单线程的,我没有使用托盘,并且我暂时断开了主窗体和具有它们的一个子窗体中的 OnCloseQuery 和 FormClose 事件。在正常使用中,程序会干净地关闭,并且不会在 Process Explorer 中留下任何痕迹。

我已经通过实验添加了 WM_QueryEndSession 和 WM_EndSession 处理程序,它们将日志消息写入 Windows 事件日志。在测试 Windows 关闭时,只有前者会触发,Wparam 和 Lparam 都为零。

对于可能导致此问题的原因或如何进一步调查的任何想法,我将不胜感激。我不愿意在不知道发生了什么的情况下尝试在 WM_QueryEndSession 上调用 Halt。

4

1 回答 1

1

在失败的最终状态下,程序重新连接了 FormCloseQuery 方法,但在每个方法中,它现在都在检查“关闭”全局布尔值,如果设置了它,则允许关闭。在主窗体上的 WM_QUERYENDSESSION 消息处理程序中,Shuttingdown 设置为 true。这适用于单一形式的应用程序。

问题是由于主窗体以外的 FormCloseQuery 处理程序都在主窗体上的 WM_QUERYENDSESSION 消息处理程序之前调用的事实引起的。在我进行的各种编辑和测试中,我错过了这个事实。

如果您的应用程序有任何具有 FormCloseQuery 处理程序的辅助表单,如果在随机时刻(例如,在结束会话时,表单可能尚未初始化)调用,结果可能是“不关闭”,那么您需要每种形式的 WM_QUERYENDSESSION 消息处理程序。然后可以设置表单或局部变量以使 FormCloseQuery 将 canclose 设置为 true。

于 2014-03-07T19:06:00.893 回答