WM_QUERYENDSESSION消息

1. 概念

MSDN:

The WM_QUERYENDSESSION message is sent when the user chooses to end the session or

when an application calls one of the system shutdown functions.

 If any application returns zero, the session is not ended.

The system stops sending WM_QUERYENDSESSION messages as soon as one application returns zero.

中文翻译:
 
当结束对话或者一个程序调用系统关闭功能的时候,WM_QUERYENDSESSION消息会被发送给尚未终止的所有窗口。

当程序在处理这个消息的时候,如果返回了false(0),那么系统将不结束对话或者关机(注销)。

所以在处理这消息的时候,我们要有个好的习惯,就是对数据进行保护操作,以免造成数据的损失。

原理:

Windows在关机的时候会向所有顶层窗口广播一个消息WM_QUERYENDSESSION,

其lParam参数可以区分是关机还是注销用户(注销用户时lParam是ENDSESSION_LOGOFF,关机则是ENDSESSION_CLOSEAPP)。

然后Windows会等到所有的应用程序都对这个消息返回TRUE才会关机,

因此,只要我们的应用程序对这个消息的处理返回FALSE,Windows就不会关机了。

注意:

它无法绝对能阻止Windows关机,

因为如果某个应用程序调用ExitWindowsEx(EWX_POWEROFF|EWX_FORCE,0);来关机,

这个程序就阻止不了,因为那样调用ExitWindowsEx,系统不会发出WM_QUERYENDSESSION消息,程序也就不能阻止Windows关机了。 
这个消息不能直接让应用程序退出,这个消息主要是询问应用程序是否已经作好了退出的准备,

当所有的应用程序都对这个消息返回TRUE,系统回(会)注销或关机。如果想退出程序,使用WM_CLOSE消息!

而且通过这个例子,大家也应该可以区分系统关机和注销用户了吧。

2. 例子

LRESULT CALLBACK WndProc (HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam)
{ 
    switch (iMsg)
    {
        case WM_DESTROY :
            PostQuitMessage (0) ;
            return 0 ;
        case WM_QUERYENDSESSION:
            //保护数据操作
            return 1;//返回1则可以结束程序
        }
        return DefWindowProc (hwnd, iMsg, wParam, lParam) ;
    }
} 


关于lParam参数是通知码有一些的值:
 
ENDSESSION_CLOSEAPP 
0x00000001
 
The application is using a file that must be replaced, the system is being serviced,or system resources are exhausted. For moreinformation, see Guidelines for Applications.
 
ENDSESSION_LOGOFF 
0x80000000



参考来源:

【1】http://www.cnblogs.com/likebeta/archive/2012/03/31/2426632.html      博主:likebeta

【2】http://blog.youkuaiyun.com/fage87295970/article/details/5086537                    博主:fage87295970

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值