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

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

   程序最小化到托盘后,会出现系统无法关闭的问题,常见于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

时间: 2024-07-28 14:31:01

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

Win7旗舰版玩游戏退出后系统变卡解决方法

  电脑游戏是生活中的一种娱乐放松方式,有用户在win7旗舰版系统中玩游戏退出后遇到系统变卡,系统反应速度非常慢,虽然重启系统后可以得到解决,但这也显得太麻烦了,那么有什么更好的办法可以解决退出游戏变卡的问题吗? Win7旗舰版玩游戏退出后系统变卡解决方法: 1.单击开始菜单--运行,然后输入"regedit" 确定. 2.打开注册表编辑器后,依次展开:[HKEY_LOCAL_MACHINESYSTEMCurrentControlSetControlSessionManagerMemo

eclipse-ecplise一运行程序,控制台显示一下后就没有了

问题描述 ecplise一运行程序,控制台显示一下后就没有了 今天打开ecplise发现打开速度慢了很多,系统的响应速度也慢了,然后写完程序第一次运行时,控制台就显示了,但是一输入数值按enter后就空白了,再一次运行都是空白,是怎么回事? 解决方案 看下是不是系统乱了,删除eclipse重新下载,删除workspace 检查电脑有没有感染360等病毒,如果有建议重装 解决方案二: 你确定不是 程序 问题?

程序猿的日常——SpringMVC系统架构与流程回顾

web开发经历了很漫长的时间,在国内也快有十几年的时间了.从最开始的进程级到现在的MVC经历了很多的改进和优化,本篇就主要复习了解下Spring MVC相关的知识. 发展历程 第一阶段 CGI进程响应 这一阶段,服务器比较弱,请求也很简单,就是用户发一个请求,服务器接收后新建进程,然后返回结果. 这种方式一看代价就很大,每次都新建进程,很麻烦. 第二阶段 Servlet线程级别响应 Servlet结构跟上面差不多,只不过每次都只是新建一个线程,这样代价就小很多了. Servlet的生命周期有四个

清除Win8升级后系统盘中的老旧系统备份文件

  有些朋友从旧版本Windows系统升级到Windows 8后会感觉系统盘空间占用比较大,这是因为Win8升级过程中会将之前的系统文件自动备份存储在Windows.old文件夹中,这个文件夹的体积从几 GB到十几GB不等,如果本身系统分区的空间不是很充足,磁盘占用的问题就会比较明显.想要删除这个文件夹,可以使用Win8系统的"磁盘清理"功能,方 法如下. 按"Win+E"打开Win8文件资源管理器,可以从系统分区中看到"Windows.old"

win7用360安全卫士修复漏洞后系统运行速度变慢怎么办

win7用360安全卫士修复漏洞后系统运行速度变慢怎么办   1.你点击C盘右键--点属性--点击磁盘清理--其他选项--在系统还原项点击清理(清理补丁后的残渣,补丁效果不会失去); 2.再用360高级注册表优化; 3.清理一下如果还没有改善,那就是东西装太多,导致系统资源占用太多,太繁杂只能重装系统了.

联想e430安装winxp系统后独立显卡无法使用的解决方案

联想e430安装winxp系统后独立显卡无法使用的解决方案  具体操作: 开机时按F1键进入BIOS界面,Config,Display,改成Integrated Graphics,按F10键保存后退出.

升级Win10系统后没有声音四种解决方案

  1. 如果你使用的是VIA HD Audio声卡,有可能会出现只在某些特定应用中才能听到声音的现象.此时可右键单击任务栏的声音图标,选择"播放设备";   2.选择"播放设备";   3.选择合适的设备作为默认通信设备(此处作为演示,演示设备未使用VIA声卡); 4.设置好默认通信设备后,再打开设备属性(上图右键菜单);   5.切换到增强选项卡,将所有增强选项去掉. 方法二: 1. 如果你使用的是Realtek audio声卡,当你遇到0x000005b4错误

gui-该程序点击窗口后为什么放大窗口才能显示标签???求帮助!!

问题描述 该程序点击窗口后为什么放大窗口才能显示标签???求帮助!! package com.woaixuchen; import java.awt.BorderLayout; import java.awt.Color; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.MouseEvent; import java.awt.event.MouseList

数据结构、c语言-急!!!!为何以下程序执行第2功能离开车厂后在vc++6.0环境下程序会报错并终止运行,求解决方案

问题描述 急!!!!为何以下程序执行第2功能离开车厂后在vc++6.0环境下程序会报错并终止运行,求解决方案 #include "stdafx.h" #include #include #include #define max 5 #define pri 5 typedef struct time{ int year; int day; int month; int hour; int min; }Time; typedef struct node{ char num[10]; Tim