根据WM_QUERYENDSESSION 文档,“应用程序应尊重用户的意图并返回 TRUE。” 该链接将其总结为“[在 XP 中] 应用程序可以返回 TRUE 以指示它们可以关闭,或 FALSE 以指示它们不应关闭”。
但是,在我自己的应用程序中,似乎发生了相反的情况:
当我返回 FALSE 时,所有正在运行的应用程序都会终止并且计算机重新启动(当我的应用程序收到
WM_ENDSESSION
消息时,wParam
设置为 1,表示“系统正在关闭或重新启动”(请参阅 WM_ENDSESSION 文档))。当我返回 TRUE 时,一些正在运行的应用程序被终止,但是当它到达我的应用程序时,它似乎停止了关闭过程,并且后续
WM_ENDSESSION
消息已wParam
设置为 0,就好像关闭已中止,而我的应用程序保持打开状态。另请注意,由于DefWindowProc
“为 [WM_QUERYENDSESSION] 返回 TRUE”,因此使用它也会以相同的方式阻止关闭。
如果我完全删除 的所有处理WM_QUERYENDSESSION
,那么整个关闭的业务将照常进行,终止我的应用程序并关闭。这可能表明我的应用程序中出现了严重错误,因为我认为这应该导致与 using 相同的行为DefWindowProc
。即使我将处理程序缩减为仅作为返回语句(使用 TRUE 或 FALSE,或者将消息和参数传递给DefWindowProc
.
由于我不想停止关闭,并且几乎只是处理它,所以我可以在它发生时记录,我可以删除它的所有处理并让事情按预期运行。当然,这并没有向我解释为什么这似乎与文档完全矛盾,所以我想知道是否有人有想法。
这一切都在 Windows XP 中下降,因此 Vista+ 的后续更改无关紧要。