【发布时间】:2012-06-01 19:36:19
【问题描述】:
根据the WM_QUERYENDSESSION docs,“应用程序应尊重用户的意图并返回TRUE。” This link 将其总结为“[在 XP 中] 应用程序可以返回 TRUE 表示可以关闭,或返回 FALSE 表示不应关闭”。
但是,在我自己的应用中,似乎相反正在发生:
当我返回 FALSE 时,所有正在运行的应用程序都将终止并重新启动计算机(当我的应用程序收到
WM_ENDSESSION消息时,wParam设置为 1,表示“系统正在关闭或重启”(见WM_ENDSESSION docs))。当我返回 TRUE 时,一些正在运行的应用程序被终止,但当它到达我的应用程序时,它似乎停止了关闭过程,随后的
WM_ENDSESSION消息将wParam设置为 0 ,好像关闭已中止,我的应用程序仍保持打开状态。另请注意,由于DefWindowProc“为 [WM_QUERYENDSESSION] 返回 TRUE”,因此使用它也会以相同的方式阻止关机。
如果我完全删除了对 WM_QUERYENDSESSION 的所有处理,那么整个关闭的业务将照常进行,终止我的应用程序并关闭。这可能表明我的应用程序中出现了严重错误,因为我认为这会导致与使用 DefWindowProc 相同的行为。即使我将处理程序缩减为仅作为返回语句(使用 TRUE 或 FALSE,或者将消息和参数传递给 DefWindowProc),我也观察到了这种行为。
由于我不想停止关闭,并且几乎只是处理它,以便在它发生时记录下来,我可以删除它的所有处理并让事情按预期运行。当然,这并没有向我解释为什么这似乎与文档完全矛盾,所以我想知道是否有人有想法。
这一切都在 Windows XP 中下降,因此 Vista+ 的后续更改无关紧要。
【问题讨论】:
-
你是偶然的一个对话框吗?从对话过程返回
TRUE与从窗口过程返回TRUE不同。 -
我提出了一堆抽象,然后很快就忘记了基础;是的,它是一个对话框,使用
SetWindowLong设置真正的返回类型使一切恢复正常。
标签: c++ winapi windows-xp shutdown