2011-04-20 80 views
2

我的问题是WM_ENDSESSION消息。也就是说,我想从应用程序(WindowProc中)当WM_ENDSESSION消息发送的主循环退出......所以,我写了这样的事情:WM_ENDSESSION消息存在问题

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; 
} 

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

我读到WM_QUERYENDSESSION WM_ENDSESSION和MSDN上,但我无法找到任何有用的信息...

任何想法,这里是错误的?

+1

有趣的是,我注意到了,我认为这只是我。我的目标是在接收WM_QUERYENDSESSION/WM_ENDSESSION时保存数据并优雅退出,尽管我的程序从未保存过任何内容。它总是被冷死。 – Damon 2011-04-20 18:25:57

+0

显示你的事件循环代码。我想这是在你的'main'函数中。 – 2011-04-20 18:46:59

+0

顺便说一句如何试图触发WM_QUERYENDSESSION/WM_ENDSESSION事件?关掉?注销?你的'windowProc'是一个顶级窗口的窗口过程吗? – 2011-04-20 18:53:31

回答

0

我会把

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

return 0;应该退出程序,如果你是在main()功能

+1

这不是如何运行消息循环。如果你打算退出主服务器,为什么还要发布一条退出的消息,因为你刚刚放弃了这个消息,所以你永远不会找回。 – 2011-04-20 18:50:41

+0

不幸的是,它不能解决问题... – malan 2011-04-20 19:07:05

3

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

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

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

更新

我不知道,即使将努力PostQuitMessage响应WM_QUERYENDSESSION。在系统处理WM_QUERYENDSESSION消息的结果之后,MSDN文档声明“WM_ENDSESSION消息是发送到应用程序”。

发送意味着消息泵不会在消息中出现裂缝。当然,即使是文档作者经常会混淆发送的的发帖

+0

这是一个错误的引用。我想也许你正在[this](http://blogs.msdn.com/b/oldnewthing/archive/2008/04/21/8413175.aspx)与[this](http://blogs.msdn的.com/b/oldnewthing /存档/ 2012/01/05/10253268.aspx)。 – 2015-07-13 08:05:05

0

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

+0

是的,如果你想保存用户数据。 – 2011-09-27 21:04:31

+0

@ x64igor虽然这是真的,但与此问题无关。 – 2011-09-27 21:15:52