gpt4 book ai didi

c++ - WM_QUERYENDSESSION 处理程序返回值没有预期效果

转载 作者:行者123 更新时间:2023-11-30 03:01:39 27 4
gpt4 key购买 nike

根据 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+ 的后续更改不相关。

最佳答案

看起来我忘记了一个关于此的关键信息:我正在为我的窗口使用对话框模板,所以它们是用对话框的所有陷阱处理的。正如在 DialogProc docs 中看到的那样, "如果对话框过程处理需要特定返回值的消息,对话框过程应通过调用 SetWindowLong 设置所需的返回值(hwndDlgDWL_MSGRESULT , lResult) 在返回 TRUE 之前。”

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

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

关于c++ - WM_QUERYENDSESSION 处理程序返回值没有预期效果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10856326/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com