2

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

任何想法,错误在哪里?

4

3 回答 3

3

我不认为调用 PostQuitMessage 来响应 WM_QUERYENDSESSION 是错误的。

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

WM_QUERYENDSESSION 授予您的窗口与用户交互的最后机会。你已经代表用户决定你的应用程序将会死掉并且你想优雅地退出,所以这是你安排它的最后机会。

更新

我不知道这是否会在 PostQuitMessage 响应 WM_QUERYENDSESSION 时起作用。MSDN 文档状态,“WM_ENDSESSION 消息在系统处理WM_QUERYENDSESSION 消息的结果后发送到应用程序。”

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

于 2011-04-20T20:27:16.760 回答
0

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

于 2011-04-20T22:13:30.187 回答
-1

我会放

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

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

于 2011-04-20T18:16:23.627 回答