1

根据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+ 的后续更改无关紧要。

4

1 回答 1

3

看起来我忘记了有关此的关键信息:我正在为我的窗口使用对话框模板,因此它们正在处理所有对话框的陷阱。如DialogProc 文档中所见,“如果对话框过程处理需要特定返回值的消息,则对话框过程应在返回之前立即通过调用SetWindowLong ( hwndDlgDWL_MSGRESULTlResult )来设置所需的返回值TRUE。”

我的问题的根源可以解释为:“如果对话框过程返回FALSE,对话框管理器将执行默认对话框操作以响应消息”,即返回FALSE导致默认行为,即返回TRUE而不阻止关闭.

还需要注意,“虽然对话框过程类似于窗口过程,但它不能调用该DefWindowProc函数来处理不需要的消息。不需要的消息由对话框窗口过程在内部处理。” 所以我几乎完全错了。

于 2012-06-04T16:12:27.947 回答