什么可能导致德尔福程序"阻止Windows关闭"?



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

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

我有经验地添加了WM_QueryEndSession和WM_EndSession处理程序,它们将日志消息写入Windows事件日志。在测试Windows关闭时,只有前一个启动,Wparam和Lparam都为零。

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

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

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

如果您的应用程序有任何具有FormCloseQuery处理程序的子窗体,如果在随机时刻调用它(例如在结束会话时,当窗体可能尚未初始化时),则结果可能是"不关闭",则您需要在每个此类窗体中使用WM_QUERYENDESSION消息处理程序。然后可以设置一个窗体或局部变量,使FormCloseQuery将canclose设置为true。

最新更新