我遇到 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,但是我找不到任何有用的信息......
任何想法,错误在哪里?
答案 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而不是处理这些消息。