MFC中应用WM_ENDSESSION,WM_QUERYENDSESSION消息截获系统的关机/注销
来源:互联网 发布:淘宝商家提供发票不符 编辑:程序博客网 时间:2024/05/16 17:17
目的:当用户注销系统的时候,注销前,让我的程序执行几行代码(释放资源/关闭端口之类的)。
思路:就跟把系统注销、重启和关机的消息都拦截下来,并销毁掉,不让其执行注销、重启和关机等操作原理是一样的。因为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 relayif(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
- MFC中应用WM_ENDSESSION,WM_QUERYENDSESSION消息截获系统的关机/注销
- ◇[DELPHI]截获WM_QUERYENDSESSION关机消息
- 截获系统注销时候的消息
- VC截获系统注销时候的消息
- WM_QUERYENDSESSION和WM_ENDSESSION
- Windows 关机消息的截获
- Windows 关机消息的截获
- MFC中定时关机、重启、注销的实现
- MFC中定时关机、重启、注销的实现
- WINDOWS注销关机消息
- [VB]监控关机程序:截取消息WM_QUERYENDSESSION,阻止关机
- MFC的PreTranslateMessage截获Ctrl + 滚轮消息
- WM_QUERYENDSESSION消息
- WM_QUERYENDSESSION消息
- MFC-关机注销重启
- DELPHI中调用API函数ExitWindowsEX可以实现系统的关机,注销,和重启
- 关机时windows发的消息WM_QUERYENDSESSION
- XP系统中关机、注销、重启功能
- android之子线程中的Toast
- (行为型模式)TEMPLATE METHOD——模板方法模式
- poj2785题解
- 迪米特法则(LOD)——最少知识原则
- ESP8266-SDK的硬件定时器
- MFC中应用WM_ENDSESSION,WM_QUERYENDSESSION消息截获系统的关机/注销
- 2016 百度之星初赛 Gym Class(优先队列+拓扑排序)
- JS 系列一: Javascript 定义类(class)的三种方法
- 拨号上网与宽带上网有什么区别?
- 结巴中文分词使用学习(python)
- android图片加载与缓存
- (结构型模式)FACADE——外观模式
- 关于android activity启动模式
- Java学习基础(1)