Windows 7下阻止系统关机

从Vista开始,想阻止系统关机就开始变麻烦了,不能只拦截WM_QUERYENDSESSION了,操作系统只给一个应用程序两秒钟的时间去保存自己的东西,两秒钟之后,不管做完了没有,Game Over!可是如果你正在刻录一张光盘呢?两秒钟是都不够的,所以Vista之后也给提供了一种方式阻止系统关机,就是ShutdownBlockReasonCreate函数,只要调用这个函数,第一个参数传递创建主窗口的句柄,第二个参数传递一个字符串,这个字符串说明阻止关机的原因,将会显示给用户。而且msdn提示说这个API函数只能由创建主窗口的线程调用,否则将返回ERROR_ACCESS_DENIED。而且完成后还得调用ShutdownBlockReasonDestroy函数使系统关机能够继续进行,参数只传递上面那个窗口的句柄就可以了。

  下面这段代码就是完整实现,不能使用VS2005编译,因为自带的库还没有这俩函数,我是使用VS2010编译的,工程文件和可执行文件的下载地址在文章最下方。

  1 #include <windows.h>
  2 #include <tchar.h>
  3 #include "resource.h"
  4
  5 //标记是否已经阻止关机,默认为未阻止
  6 BOOL blockedFlag = FALSE;
  7
  8 //这俩函数纯粹是撒娇,为了突出它们才拿出来改个名的
  9 BOOL BlockShutdown(HWND hwnd)
 10 {
 11     if (ShutdownBlockReasonCreate(hwnd, _T("不准关机!除非你点强制关机 :-(")))
 12     {
 13         return TRUE;
 14     }
 15     return FALSE;
 16 }
 17
 18 BOOL UnblockShutdown(HWND hwnd)
 19 {
 20     if (ShutdownBlockReasonDestroy(hwnd))
 21     {
 22         return TRUE;
 23     }
 24     return FALSE;
 25 }
 26
 27 INT_PTR CALLBACK MainDialogProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
 28 {
 29     switch(uMsg)
 30     {
 31     case WM_INITDIALOG:
 32         SetDlgItemText(hwndDlg, IDC_STATIC_STATUS, _T("未阻止关机"));
 33         return TRUE;
 34     case WM_CLOSE:
 35         if (blockedFlag)
 36         {
 37             if (UnblockShutdown(hwndDlg))
 38             {
 39                 EndDialog(hwndDlg, 0);
 40                 return TRUE;
 41             }
 42             if (IDYES == MessageBox(hwndDlg, _T("解除阻止失败……还要继续关闭程序么(关闭程序后不影响关机)?"), _T("提示"), MB_YESNO))
 43             {
 44                 EndDialog(hwndDlg, 0);
 45                 return TRUE;
 46             }
 47             return FALSE;
 48         }
 49         EndDialog(hwndDlg, 0);
 50         return TRUE;
 51     case WM_QUERYENDSESSION:
 52         if (blockedFlag)        //不要以为只调用BlockShutdownReasonCreate就行了,WM_QUERYENDSESSION也得拦住
 53         {
 54             return TRUE;
 55         }
 56         return FALSE;
 57     case WM_COMMAND:
 58         switch(LOWORD(wParam))
 59         {
 60         case IDC_BUTTON_BLOCK:
 61             if (blockedFlag)
 62             {
 63                 MessageBox(hwndDlg, _T("已经阻止关机,请点击关机测试。"), _T("提示"), MB_OK);
 64             }
 65             else
 66             {
 67                 if (BlockShutdown(hwndDlg))
 68                 {
 69                     SetDlgItemText(hwndDlg, IDC_STATIC_STATUS, _T("已经阻止关机"));
 70                     blockedFlag = TRUE;
 71                 }
 72                 else
 73                 {
 74                     MessageBox(hwndDlg, _T("阻止关机失败了……"), _T("提示"), MB_OK);
 75                 }
 76             }
 77             return TRUE;
 78         case IDC_BUTTON_UNBLOCK:
 79             if (!blockedFlag)
 80             {
 81                 MessageBox(hwndDlg, _T("未阻止关机,无需解除。"), _T("提示"), MB_OK);
 82             }
 83             else
 84             {
 85                 if (UnblockShutdown(hwndDlg))
 86                 {
 87                     SetDlgItemText(hwndDlg, IDC_STATIC_STATUS, _T("未阻止关机"));
 88                     blockedFlag = FALSE;
 89                 }
 90                 else
 91                 {
 92                     MessageBox(hwndDlg, _T("解除阻止失败了……"), _T("提示"), MB_OK);
 93                 }
 94             }
 95             return TRUE;
 96         default:
 97             return FALSE;
 98         }
 99     default:
100         return FALSE;
101     }
102     return FALSE;
103 }
104 int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd)
105 {
106     DialogBox(hInstance, MAKEINTRESOURCE(IDD_MAINDIALOG), NULL, MainDialogProc);
107     return 0;
108 }

  下图就是运行效果。

  上面这个图应该很多人看到过,只是通常刚一显示就消失了,这样就不会消失了,直到程序调用了ShutdownBlockReasonDestroy。

  还有一点需要注意的是,如果你的电脑安装了360安全卫士orQQ电脑管家等优化软件,通常都会一键优化给优化掉……你就看不到这个对话框了,程序直接被枪毙掉了,因为这样可以加快关机速度 :-(

  完整的C语言工程和可执行程序文件都在压缩包里,为了方便没装VS2010的童鞋测试程序效果,msvcr100.dll我也放到release目录下了,下载地址是http://files.cnblogs.com/pianoid/ShutdownBlocker.rar

时间: 2024-08-31 08:44:34

Windows 7下阻止系统关机的相关文章

关于DOS(windows)下取得系统日期的方法:用于自动数据库备份等

window|备份|数据|数据库 前2天碰到一个客户的Oracle在SCO下的自动备份EXP Script出现问题,无法正常执行,如果重新安装Oracle需要准备.但是备份也不能耽搁,要不然数据库丢了可是麻烦.于是想在Windows的客户端写个自动备份的Script 实现定时的自动备份.可是在Windows下去到的系统时间就是有"2004-11-25 星期四"这样的格式作为文件名可是不行啊.于是去Internet 找了一把,没有结果,只好作罢,给个固定的文件名临时使用. 过来2天我还是

Windows 8系统关机的5种方法

  Windows8的关机位置"太隐蔽",导致很多初次使用新系统的用户都不知道Windows 8如何关机.另外,Windows 8关机的操作也比较繁琐,整个过程需要使用多次滑动且进入两层界面才能完成. 第一种:原始关机 首先,我们来看一下最原始.但也最繁琐的Windows 8关机方法,向右侧角落滑动出现超级按钮. 点击"设置"---"电源"---"关机",即可. 第二种:快捷键关机 用户在Windows界面下按"Al

Windows 8系统关机的方法大盘点

  虽然Windows 8各版本一直在泄露,但面对一款全新的系统用户显然无从下手.Windows 8如何解锁?没有键盘鼠标怎么操作?本文将为你揭晓Windows 8系统关机的秘密. 1.通过Charms超级栏关闭Windows 8 在Windows 8中,微软引入了Charms Bar超级栏,将鼠标悬停在任务栏右下角即可调出Charm栏,也可以通过快捷键Win+C打开它,点击"设置"即可出现关机.重启和休眠选项,或者使用快捷键Win+I直接打开"设置"选项. 2.创

Windows Server 2008下为系统分区“减负”

计算机系统运行时间一长,其运行速度将会明显变慢,并且时不时地还出现系统分区空间不够用的提 示,对于这样的现象,相信几乎所有的人都深有感触!造成这种现象的主要原因就是系统分区"不堪重负 ",想办法为系统分区"减负",已经变得刻不容缓.不同的系统环境下,为系统分区"减负"的操作有 时会不一样:现在,本文就为各位朋友介绍Windows Server 2008下为系统分区"减负"的秘籍! 1.不让上网垃圾"拖累"系

Windows 7下如何开启与关闭系统分级功能

  故障现象: Windows 7下如何开启与关闭系统分级功能. 解决方案: 系统分级是Windows 7操作系统自带的电脑性能检测工具,测量计算机硬件和软件配置的功能,并将此测量结果表示为称作基础分数的一个数字.较高的基础分数通常表示计算机比具有较低基础分数的计算机运行得更好和更快. 每个硬件组件都会接收单独的子分数.计算机的基础分数是由最低的子分数确定的,基础分数不是合并子分数的平均数.例如,如果某个硬件组件的最低子分数是 5.9,则基础分数就是 5.9. 子分数是计算机的处理器(CPU).

笔记本win7系统关机的时候弹出To return to windows的解决方法

  出现这种提示是因为系统还有正在运行的应用程序,我们需要把这些应用程序关闭了,一般只有这样系统才会执行关机的操作.那么,笔记本win7系统提示To return to windows怎么办呢? 一.在笔记本win7系统关机前,用户首先应确保系统应用程序已经全部关闭.如果大家不知道系统有哪些正在运行的程序项的话,能够通过Ctrl+Shift+Esc键进入任务管理器,其次在任务管理器上结束"应用程序". 二.如果用户在任务管理器进程选项卡里面发现列表为空,那么就表示表示没有正在运行的任务

Windows 7旗舰版系统下浏览器网页输入框无法输入文字

  原因分析: windows 7旗舰版系统中,某些软件会在HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Windows/CurrentVersion/ Policies/System 路径下写入一个注册表EnableUIPI ,而这个注册表会造成IE9/IE10滚轮失效,导致无法输入文字的故障. 解决方案: 1.在键盘上按"Win+R"快捷键,输入"regedit"命令,回车打开注册表; 2.在打开的注册表编辑器,依次展开"

图片-在Windows 7下安装Linux双系统时出现黑屏

问题描述 在Windows 7下安装Linux双系统时出现黑屏 我用U盘在Windows 7下安装Linux双系统,进入Linux安装首页,然后点击安装,屏幕刷刷的出现了一些检测什么的,一切貌似很正常,之后就黑屏了,等了一会也没有一点反应,没办法只好重启了.这和我的显卡有关系吗?我的硬盘腾出了50G的内存,没有分配分区,应该够的吧?求各位大神指点一下小弟呀!谢谢大家! 解决方案 如何在windows下安装linux双系统,不用虚拟机在windows7下安装xp 双系统Windows与linux双

u盘-在Windows 7下安装Linux双系统时出现黑屏

问题描述 在Windows 7下安装Linux双系统时出现黑屏 我用U盘在Windows 7下安装Linux双系统,进入Linux安装首页,然后点击安装,屏幕刷刷的出现了一些检测什么的,一切貌似很正常,之后就黑屏了,等了一会也没有一点反应,没办法只好重启了.求各位大神指点一下小弟呀!谢谢大家! 解决方案 描述的不太详细,不好判断是哪方面出的问题.现在你的Windows启动有问题吗? 如果没问题 可以考虑虚拟机.或者重新安装. 安装过程中的等待是必要的. 解决方案二: 如何在windows下安装l