【问题标题】:Problem with WM_ENDSESSION messageWM_ENDSESSION 消息的问题
【发布时间】:2011-04-21 06:13:30
【问题描述】:

我对 WM_ENDSESSION 消息有疑问。也就是说,当 WM_ENDSESSION 消息正在发送时,我想退出应用程序的主循环(WindowProc)......所以,我写了这样的东西:

LRESULT CALLBACK windowProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
    switch(msg)
    {
    //...       
    case WM_QUERYENDSESSION: return TRUE;       
    case WM_ENDSESSION: 
         if(wParam) PostQuitMessage(0);         
    break;    
    default:
        return DefWindowProc(hwnd,msg,wParam,lParam);
    }

    return 0;
}

...,但它不起作用 - 应用程序没有退出主循环...

我在 msdn 上阅读了有关 WM_QUERYENDSESSION 和 WM_ENDSESSION 的信息,但找不到任何有用的信息...

知道了,错在哪里?

【问题讨论】:

  • 很有趣,我也注意到了,我还以为是我自己。我的目标是保存数据并在收到 WM_QUERYENDSESSION/WM_ENDSESSION 时优雅地退出,尽管我的程序从未保存过任何东西。它总是被冷死。
  • 显示你的事件循环代码。我猜它在你的main 函数中。
  • 顺便说一句,您如何尝试触发 WM_QUERYENDSESSION/WM_ENDSESSION 事件?关闭?注销?你的windowProc是顶层窗口的窗口过程吗?
  • @Damon:我当然会把 PostQuitMessage 放在 WM_QUERYENDSESSION 中,但这是不正确的解决方案... @Serge Dundich:是的,我的循环在 main: int main() { // Init窗口...味精事件; while(GetMessage(&event,0,0,0)) { TranslateMessage(&event);调度消息(&事件); } //... 返回事件.wParam; } > 您如何尝试触发 WM_QUERYENDSESSION/WM_ENDSESSION 事件?注销。
  • 它甚至会在 WM_ENDSESSION 的处理程序处着陆吗?我敢打赌不是。

标签: c++ winapi windows-messages


【解决方案1】:

我认为调用 PostQuitMessage 来响应 WM_QUERYENDSESSION 并没有错。

WM_ENDSESSION 是世界末日。到那时再推迟工作(调用 PostQuitMessage)为时已晚。现在就去做,否则你永远没有机会去做。另外,考虑一下你在做什么。正如 Raymond Chen 所说,“[清理应用以响应 WM_ENDSESSION] 就像在拆除建筑物之前花时间用蒸汽清洁地毯。浪费精力。”

WM_QUERYENDSESSION 授予您的窗口与用户交互的最后机会。您已代表用户决定您的应用程序将终止并且您希望优雅地退出,因此这是您安排它的最后机会。

更新

我什至不知道 PostQuitMessage 对 WM_QUERYENDSESSION 的响应是否有效。 MSDN 文档指出,“在系统处理 WM_QUERYENDSESSION 消息的结果之后,WM_ENDSESSION 消息发送到应用程序。”

Sent 意味着消息泵不会对消息进行破解。当然,即使是文档作者也经常混淆 sentposted

【讨论】:

  • 这是一个错误的引用。我想你可能把thisthis 混淆了。
【解决方案2】:

您不需要任何特殊处理。只需调用 DefWindowProc 而不是处理这些消息。

【讨论】:

  • 是的,如果您想保存用户数据。
  • @x64igor 这是真的,但与这个问题无关。
【解决方案3】:

我会放

switch(msg)
{
    //...  
    case WM_ENDSESSION:  
        if(wParam) PostQuitMessage(0);  
        return 0;  
    //...  
}

如果你在main()函数中,输入return 0;应该退出程序

【讨论】:

  • 这不是运行消息循环的方式。如果您要从 main 中退出,为什么还要发布一条您永远不会检索到的退出消息,因为您刚刚放弃了船。
猜你喜欢
  • 1970-01-01
  • 2022-06-11
  • 1970-01-01
  • 2020-06-28
  • 2019-03-03
  • 2021-08-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多