【问题标题】:WM_QUERYENDSESSION handler return values not having intended effectWM_QUERYENDSESSION 处理程序返回没有预期效果的值
【发布时间】: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


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 2020-06-30
    • 1970-01-01
    • 1970-01-01
    • 2019-08-27
    • 2018-01-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-28
    相关资源
    最近更新 更多