我的一个Delphi XE2程序在运行和空闲时“阻止Windows关闭”。大多数应用程序都不是这种情况,我需要解决它。在XP上,Windows默默无法关闭;在Win7上,对话框显示我的应用程序阻止关机。
与此处的类似问题不同,程序是单线程的,我没有使用托盘,我暂时断开了主窗体中的OnCloseQuery和FormClose事件以及拥有它们的一个子窗体。在正常使用中,程序干净地关闭,并且在Process Explorer中没有任何痕迹。
我已经实验性地添加了WM_QueryEndSession和WM_EndSession处理程序,它们将日志消息写入Windows事件日志。在测试Windows关闭时,只有前者触发,Wparam和Lparam都为零。
对于可能导致此问题的任何想法,或者如何进一步调查,我将非常感激。我不愿意在不知道发生了什么的情况下尝试在WM_QueryEndSession上调用Halt。
答案 0 :(得分:1)
在失败的最终状态下,程序重新连接了FormCloseQuery方法,但是在每个方法中它现在检查'shuttingdown'全局布尔值,并且如果设置了则允许关闭。在主窗体上的WM_QUERYENDSESSION消息处理程序中将Shuttingdown设置为true。这适用于单一表单应用程序。
问题是由于主窗体之外的FormCloseQuery处理程序在主窗体上的WM_QUERYENDSESSION消息处理程序之前都被调用了。我在各种编辑和测试中错过了这个事实。
如果您的应用程序具有任何具有FormCloseQuery处理程序的子表单,其中如果在随机时刻调用结果,则结果可能是“不关闭”(例如,在结束会话时,表单可能尚未初始化)那么你需要在每个这样的表格中使用WM_QUERYENDSESSION消息处理程序 。然后,可以设置一个表单或局部变量,以使FormCloseQuery将canclose设置为true。