WM_QUERYENDSESSION处理程序返回的值没有预期的效果

时间:2012-06-01 19:36:20

标签: c++ winapi windows-xp shutdown

根据the WM_QUERYENDSESSION docs,“应用程序应尊重用户的意图并返回TRUE。” This link将其概括为“[在XP中]应用程序可以返回TRUE表示它们可以被关闭,或者FALSE表示它们不应该被关闭”。

然而,在我自己的应用程序中,似乎相反正在发生:

  • 当我返回FALSE时,所有正在运行的应用程序都会终止并且计算机重新启动(当我的应用程序收到WM_ENDSESSION消息时,wParam设置为1,表示“系统正在关闭或重新启动“(见WM_ENDSESSION docs))。

  • 当我返回TRUE时,一些正在运行的应用程序被终止,但当它到达我的应用程序时,它似乎停止了关闭过程,并且后续的WM_ENDSESSION消息已{{1}设置为0,好像关闭已中止,我的应用程序仍保持打开状态。另请注意,由于wParam“为[WM_QUERYENDSESSION]”返回TRUE,因此使用它也会以相同方式阻止关闭。

如果我完全删除DefWindowProc的所有处理,则整个关闭业务正常进行,终止我的应用并关闭。这可能表明我的应用程序中存在严重错误,因为我认为这应该导致与使用WM_QUERYENDSESSION相同的行为。我已经观察到这种行为,即使我将我的处理程序减少为仅返回语句,可以是TRUE或FALSE,也可以将消息和参数传递给DefWindowProc

因为我不想停止关闭,并且几乎只是处理它所以我可以记录它发生时,我可以删除所有处理它并让事情按照需要行事。当然,这并没有向我解释为什么这似乎与文档完全矛盾,所以我想知道是否有人有想法。

这在Windows XP中都有所下降,因此Vista +的后续更改无关紧要。

1 个答案:

答案 0 :(得分:3)

看起来我忘记了关于此的一些关键信息:我正在使用窗口的对话框模板,所以他们正在处理所有对话框的陷阱。如DialogProc docs中所示,“如果对话框过程处理需要特定返回值的消息,则对话框过程应通过调用SetWindowLong来设置所需的返回值( hwndDlg TRUE之前,em>, DWL_MSGRESULT lResult )。“

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

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