WM_ENDSESSION消息出现问题

时间:2011-04-20 18:03:33

标签: c++ winapi windows-messages

我遇到 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,但是我找不到任何有用的信息......

任何想法,错误在哪里?

3 个答案:

答案 0 :(得分:3)

我认为在响应WM_QUERYENDSESSION时调用PostQuitMessage是不对的。

WM_ENDSESSION是世界末日。在这一点上推迟工作直到稍后(称为PostQuitMessage)为时已晚。现在就做,或者你永远不会有机会去做。另外,考虑一下你在做什么。正如Raymond Chen曾经说过的那样,“[清理你的应用程序以响应WM_ENDSESSION]就像在拆除建筑物之前花时间蒸汽清洁地毯一样。浪费精力。”

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

<强>更新

我不知道甚至会对PostQuitMessage起作用以响应WM_QUERYENDSESSION。 MSDN文档声明“在系统处理WM_QUERYENDSESSION消息的结果后,WM_ENDSESSION消息已发送到应用程序。”

发送意味着消息泵不会破坏消息。当然,即使是文档作者也经常混淆发送发布

答案 1 :(得分:0)

我会把

switch(msg)
{
    //...  
    case WM_ENDSESSION:  
        if(wParam) PostQuitMessage(0);  
        return 0;  
    //...  
}
如果你在return 0;函数

,那么

main()放回该程序

答案 2 :(得分:0)

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