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

简介:  程序缩小到托盘后系统就无法关机(解决方案)                       老帅   程序最小化到托盘后,会出现系统无法关闭的问题,常见于WinXP系统中,这里提供一个解决方案!一、解决方案响应系统关机消息procedure WMQ...
 程序缩小到托盘后系统就无法关机(解决方案)
                       老帅
   程序最小化到托盘后,会出现系统无法关闭的问题,常见于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


相关文章
|
4月前
|
Ubuntu
qml加载开机白屏易死机的解决方案
本文讨论了在QML开发中遇到的加载白屏和死机问题,并提供了解决方案。文章给出了QML在开发板上启动时白屏问题的解决方法,以及在加载网络图片时可能导致的卡死问题,并分享了相关的参考链接和最佳实践代码示例。
|
调度
MacBookPro外接显示器程序全屏状态,另一个显示器就黑屏
MacBookPro外接显示器程序全屏状态,另一个显示器就黑屏
718 0
MacBookPro外接显示器程序全屏状态,另一个显示器就黑屏
|
7月前
|
Windows
【已解决】电脑更新系统之后,键盘失灵了怎么办?
【已解决】电脑更新系统之后,键盘失灵了怎么办?
|
8月前
|
iOS开发
iOS16.1系统由于一个系统弹窗无法取消,导致屏幕卡死无法关机问题及解决方案
iOS16.1系统由于一个系统弹窗无法取消,导致屏幕卡死无法关机问题及解决方案
874 0
电脑桌面黑屏,但程序还可以正常运行
电脑桌面黑屏,但程序还可以正常运行
268 0
|
Windows
【笔记本解决触摸板手势失效的办法】
【笔记本解决触摸板手势失效的办法】
365 1
【笔记本解决触摸板手势失效的办法】
w10升级至W11系统,黑屏但鼠标与桌面快捷方式能用,如何解决
w10升级至W11系统,黑屏但鼠标与桌面快捷方式能用,如何解决
|
存储 Linux Android开发
|
API Windows
【clswindow框架应用】自动移动鼠标避免锁屏,鼠标随机移动防止锁屏、待机、休眠
【clswindow框架应用】自动移动鼠标避免锁屏,鼠标随机移动防止锁屏、待机、休眠
740 0
【clswindow框架应用】自动移动鼠标避免锁屏,鼠标随机移动防止锁屏、待机、休眠
python小玩意——无限锁屏(重新开机可以恢复)
python小玩意——无限锁屏(重新开机可以恢复)