程序缩小到托盘后系统就无法关机(解决方案)——处理WM_QUERYENDSESSION消息,并把它标识为处理过了

程序缩小到托盘后系统就无法关机(解决方案)
                       老帅

程序最小化到托盘后,会出现系统无法关闭的问题,常见于WinXP系统中,这里提供一个解决方案!

一、解决方案

响应系统关机消息
procedure WMQUERYENDSESSION(var msg:Tmessage);message WM_QUERYENDSESSION;

procedure TFormTray.WMQUERYENDSESSION(var msg: Tmessage);
begin
  msg.Result := 1;
end;

二、原理

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)。然后Windows会等到所有的应用程序都对这个消息返回TRUE才会关机,因此,只要我们的应用程序对这个消息的处理返回FALSE,Windows就不会关机了。而且通过这个例子,大家也应该可以区分系统关机和注销用户了。

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 more information, see Guidelines for Applications.

ENDSESSION_CRITICAL
0x40000000

The application is forced to shut down.

ENDSESSION_LOGOFF 
0x80000000

The user is logging off.

更多信息:http://msdn.microsoft.com/en-us/library/windows/desktop/aa376890(v=vs.85).aspx

http://blog.csdn.net/shuaihj/article/details/41700411

时间: 2024-08-29 16:58:47

程序缩小到托盘后系统就无法关机(解决方案)——处理WM_QUERYENDSESSION消息,并把它标识为处理过了的相关文章

程序缩小到托盘后系统就无法关机(解决方案)

程序缩小到托盘后系统就无法关机(解决方案)                       老帅    程序最小化到托盘后,会出现系统无法关闭的问题,常见于WinXP系统中,这里提供一个解决方案!一.解决方案 响应系统关机消息procedure WMQUERYENDSESSION(var msg:Tmessage);message WM_QUERYENDSESSION; procedure TFormTray.WMQUERYENDSESSION(var msg: Tmessage);begin  m

设置Qt程序在Windows开机后自动运行

(转自:http://blog.csdn.net/weiren2006/article/details/7443362) 让软件在系统启动时自动运行,可通过修改注册表实现. 在\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run中添加需启动的程序路径,代码如下: voidautoStart(boolflag){//写入注册表,开机自启动HKEYhKey;//找到系统的启动项LPCTSTRlpRun=(wchar_t*)

关于HP DL380e服务器安装提示“安装程序无法创建新的系统分区也无法定位”

这里将刚刚遇到的一个服务器安装问题总结一下,以便自己后续使用,事实证明,几篇关于服务器的博文,收益最多的还是自己,因为每次都有不一样的问题,每次都在翻这些文章,所以我明白今天记下这个问题的重要性,Just for me!!! 说明一下,此类问题较为普遍,可能不是最优解,但是这里提供一下个人的见解,毕竟我个人在这个问题上成功了! 机型:HPDL380e 初始RAID:RAID1 本次安装的镜像为Server08 SP2,使用U盘刻录的镜像完成 再次说下吧,惠普的机器,F9是主板设置(可能不准确,但

LoadRunner测试ajax框架,回放后系统中没有产生数据解决方法

LoadRunner测试ajax框架的系统时,录制回放都没有报错,但是回放后系统中没有产生数据,数据始终不能写入数据库.查了一下原因,应该是录制的脚本不完善的问题,因为JS是在客户端执行的程序,LR只能监控客户机与服务器之前的通信. 解决方法: Recording options> HTTP Properites> Advanced > Headers: 选择"Record headers not in list", 然后点ok. 重新录制一遍脚本,会发现脚本里多出一

如何让自己的Android程序、Service永不被系统kill

具体做法如下: 1. 设置FLAG_PERSISTENT:在AndroidManifest.xml文件中,加入android:persistent="true" : 2. 设置FLAG_SYSTEM:将你写的应用程序放到/system/app/目录下即可.具体操作如下: A. 使用Cygwin或cmd进入你工程所在的bin目录中,然后执行如下两条命令: adb remount adb push yourpackage.apk /system/app/ 命令adb remount是为了获

“安装程序无法创建新的系统分区,也无法定位现有分区”的解决方案

walker在安装原版Windows Server 2008 R2时遇到"安装程序无法创建新的系统分区,也无法定位现有分区"问题,记录一下解决过程. 1.shift+F10进入命令行,用diskpart相关命令(active)激活C盘分区. 2.用U盘进入PE系统. (1).将原版ISO文件解压后的boot(文件夹).sources(文件夹).bootmgr(文件)拷贝到C盘. (2).在PE的命令行里面执行命令修复引导扇区:c:\boot\bootsect.exe /nt60 c:.

pyqt5程序使用py2exe打包后运行时报找不到Qt platform plugin ‘windows’错误

pyqt5程序使用py2exe打包后运行时报找不到Qt platform plugin 'windows'错误 现象描述: 64位windows系统下直接将pyqt5的plugins下的platforms文件夹复制到exe相同目录即可,但在32位系统下一直报找不到Qt platform plugin 'windows'错误. 解决方案: 在exe同目录下新建plugins文件夹,然后将platfroms文件夹移到新建的文件夹下,同时修改main方法,添加以下代码: QApplication.ad

“小程序+”时代——公众号拓展系统

如今,微信已经成为全球使用人数最多的移动通讯应用,用户数量呈爆发式增长,是当前中国最重要的智能手机应用终端之一.而微信公众号于2012年8月诞生,至今约有上千万个微信公众号. 而微信小程序于2017年1月9日凌晨正式上线.小程序一开始作为微信生态万物互联的连接器出现,具备链接线上与线下的诸多能力.因此,大量的线下传统企业为了实现互联网+,提升企业效率,就刚好找到这个需要合适的渠道连接器. 在这种国内小程序蓬勃发展的大前提下,11月22日,在微盟小程序沙龙长沙站上,微盟创始人兼CEO孙涛勇现场就小

【系统安装】安装程序无法创建新的系统分区

安装程序无法创建新的系统分区,也无法定位现有系统分区 可以进入pe后把minipe文件夹复制到D盘,然后重启,就自动加载D盘的外置了,这时候直接拔掉U盘,然后运行win7安装程序, 只需要一步,就可轻松解决,在win7安装到选择硬盘时,如果出现题目中的问题,别急,你先格式化一下你要装的那个盘,然后,拔出U盘,啥也别动,只拔出U盘究行,再装上U盘,然后刷新一下[选硬盘那里的高级选项中有格式化和刷新],再选择要安装的硬盘点下一步,OK了,可以正常安装了,希望看到此问题的朋友互相转载一下,不要把这个问