WM_ENDSESSION消息有问题

| 我对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的信息,但是找不到任何有用的信息... 任何想法,错误在哪里?     
已邀请:
我认为调用PostQuitMessage响应WM_QUERYENDSESSION是不对的。 WM_ENDSESSION是世界的尽头。此时已经太晚了,无法将工作推迟到以后(调用PostQuitMessage)。现在就做,否则您将永远没有机会做。另外,考虑您在做什么。正如雷蒙德·陈(Raymond Chen)曾经说过的那样,“ [响应WM_ENDSESSION清理您的应用程序,就像是在拆除建筑物之前花时间蒸汽清理地毯。浪费了精力。“ WM_QUERYENDSESSION授予您的窗口与用户交互的最后机会。您已代表用户确定您的应用将终止,并且希望正常退出,因此这是您安排应用的最后机会。 更新 我不知道它甚至可以对PostQuitMessage起作用以响应WM_QUERYENDSESSION。 MSDN文档状态为“系统处理WM_QUERYENDSESSION消息的结果后,WM_ENDSESSION消息将发送到应用程序。” 发送表示邮件泵不会破解邮件。当然,甚至文档作者也经常混淆发送和发布。     
您不需要任何特殊处理。只需调用DefWindowProc,而不处理这些消息。     
我会把
switch(msg)
{
    //...  
    case WM_ENDSESSION:  
        if(wParam) PostQuitMessage(0);  
        return 0;  
    //...  
}
如果您处于
main()
功能中,则将
return 0;
放置应退出程序     

要回复问题请先登录注册