MFC中应用WM_ENDSESSION,WM_QUERYENDSESSION消息截获系统的关机/注销
2016-05-21 17:43
507 查看
目的:当用户注销系统的时候,注销前,让我的程序执行几行代码(释放资源/关闭端口之类的)。
思路:就跟把系统注销、重启和关机的消息都拦截下来,并销毁掉,不让其执行注销、重启和关机等操作原理是一样的。因为Windows在注销、重起、关机之前会向每个当前正在运行的应用程序广播一个消息WM_QUERYENDSESSION, 其lParam参数可以区分是关机还是注销用户(注销用户时lParam是ENDSESSION_LOGOFF)。然后Windows会等到所有的应用程序都对这个消息返回TRUE才会关机,因此,只要我们的应用程序对这个消息的处理返回FALSE,Windows就不会关机了。当系统注销的时候,所有非系统级的程序都会被退出,如果想让自己的程序在注销时仍然可以运行,就将自己的程序做成系统服务程序。
解决途径:拦截系统广播出来的WM_ENDSESSION和WM_QUERYENDSESSION消息。插一句:方法应该不止一种,比如系统钩子,但是参考网友的解决方案,程序一运行系统就奔溃了。没想到在MFC里面非常容易的通过重载WindowProc就可以实现,方法如下。
在MFC中的解决方法:
环境:VS 6.0, XP 32-bit
“查看”-->"建立类向导...",将WindowProc重载。
其函数体如下:
就这样,系统注销的时候我的函数turnOff();被执行了。
关于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 more information, see Guidelines for Applications.
ENDSESSION_LOGOFF
0x80000000
非常有帮助的链接:
http://www.cnblogs.com/likebeta/archive/2012/03/31/2426632.html
http://blog.sina.com.cn/s/blog_7ce2cb410100wydw.html
http://www.cnblogs.com/lidabo/archive/2012/11/29/2795269.html
http://blog.csdn.net/silvervi/article/details/5131299
http://blog.csdn.net/goingup/article/details/457128
思路:就跟把系统注销、重启和关机的消息都拦截下来,并销毁掉,不让其执行注销、重启和关机等操作原理是一样的。因为Windows在注销、重起、关机之前会向每个当前正在运行的应用程序广播一个消息WM_QUERYENDSESSION, 其lParam参数可以区分是关机还是注销用户(注销用户时lParam是ENDSESSION_LOGOFF)。然后Windows会等到所有的应用程序都对这个消息返回TRUE才会关机,因此,只要我们的应用程序对这个消息的处理返回FALSE,Windows就不会关机了。当系统注销的时候,所有非系统级的程序都会被退出,如果想让自己的程序在注销时仍然可以运行,就将自己的程序做成系统服务程序。
解决途径:拦截系统广播出来的WM_ENDSESSION和WM_QUERYENDSESSION消息。插一句:方法应该不止一种,比如系统钩子,但是参考网友的解决方案,程序一运行系统就奔溃了。没想到在MFC里面非常容易的通过重载WindowProc就可以实现,方法如下。
在MFC中的解决方法:
环境:VS 6.0, XP 32-bit
“查看”-->"建立类向导...",将WindowProc重载。
其函数体如下:
LRESULT CLabRelayDlg::WindowProc(UINT message, WPARAM wParam, LPARAM lParam) { // TODO: Add your specialized code here and/or call the base class // WM_QUERYENDSESSION消息是Windows向你询问Windows能否关闭 // WM_ENDSESSION消息表示提示你Windows即将关闭。 switch(message) { case WM_ENDSESSION: // 把消息销毁掉,不让其正确转发。 //message = WM_USERMESSAGE_NULL; //turn off the relay if(relayState==RELAY_ON) turnOff(); break ; case WM_QUERYENDSESSION: //注销/关机 //turn off the relay if(relayState==RELAY_ON) turnOff(); break ; } return CDialog::WindowProc(message, wParam, lParam); }
就这样,系统注销的时候我的函数turnOff();被执行了。
关于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 more information, see Guidelines for Applications.
ENDSESSION_LOGOFF
0x80000000
非常有帮助的链接:
http://www.cnblogs.com/likebeta/archive/2012/03/31/2426632.html
http://blog.sina.com.cn/s/blog_7ce2cb410100wydw.html
http://www.cnblogs.com/lidabo/archive/2012/11/29/2795269.html
http://blog.csdn.net/silvervi/article/details/5131299
http://blog.csdn.net/goingup/article/details/457128
相关文章推荐
- 解决XP无法停止‘通用卷’的方法合集
- BBSXP漏洞再探究
- 在WINXP系统上安装SQL Server企业版的方法
- 为你的Win XP瘦身的图文教程第1/2页
- Windows 2000、XP、2003登录密码恢复攻略
- Transformation 能将 Windows XP/Server 2003 操作系统,完美地模拟成 Windows Vista 的软件
- XP/win2003下发现1G的内存比512M还慢的解决方法
- 深度 Ghost XP 八分钟快速装机版 V5.0 下载地址
- Deepin Windows XP Lite V5.8 完美精简正式版 下载地址
- Windows XP Service Pack 3 RC1 v.3244 winxp补丁3 提供下载
- 番茄花园 Windows XP Pro SP2 免激活 V3.5迅雷高速下载
- Windows XP 装机无忧 v1.10 迅雷可下载
- 番茄花园 Ghost XP SP2 V3.0 免激活版 提供下载地址
- 深度Ghost XP 快速装机版3.0 下载
- 可自定义oem的萝卜家园 Ghost XP 新春装机版 V200801 下载
- 霏凡 Ghost XP 会员版V2修正版 提供下载了
- Visual C++中MFC消息的分类
- MFC中Radio Button的用法详解
- MFC对话框中添加状态栏的方法
- MFC创建右键弹出菜单的方法