什么可能导致Delphi程序“阻止Windows关机”?

问题描述:

我的一个Delphi XE2程序在运行和闲置时'阻止Windows关机'。我的大部分应用程序都不是这样,我需要解决它。在XP上,Windows默默无法关闭;在Win7上,对话框显示我的应用程序阻止关机。什么可能导致Delphi程序“阻止Windows关机”?

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

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

如果有什么可能导致这种情况,或者如何进一步调查,我将不胜感激。我不愿意在不知道发生了什么的情况下尝试调用WM_QueryEndSession上的Halt。

+0

你可以实现WM_QueryEndSession并调用Application.Terminate – whosrdaddy

+0

当Windows告诉它时为什么不关闭你的程序? –

+0

@大卫:那正是我想要发现的! – frogb

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

该问题是由主窗体以外的FormCloseQuery处理程序在主窗体上的WM_QUERYENDSESSION消息处理程序之前全部调用所致。我已经在我做过的各种编辑和测试中错过了这个事实。

如果您的应用程序具有任何具有FormCloseQuery处理程序的子窗体,如果它在随机时刻被调用,结果可能是“不关闭”(例如,在结束会话时,当表单可能未被初始化),那么你需要一个WM_QUERYENDSESSION消息处理程序,其格式为。这可以设置一个窗体或局部变量来使FormCloseQuery将canclose设置为true。

+0

我有一个类似的情况。辅助表单的OnFormCloseQuery阻止了整个应用程序的关闭。值得注意的是,这个表单是在运行时创建的,但从未显示过。所以缺陷并不明显,因为关闭查询将针对每个现有表单执行,而不仅仅针对那些显示。在我的情况下,一个不恰当的初始化变量是罪魁祸首。 –