Windows 7下阻止系统关机
2012-06-20 20:04
323 查看
好长时间不更新博客了,今天终于把毕业设计答辩完了,虽然没完全做到自己预先设定的目标,但是起码算是效果出来了。虽然很长时间不更博客,但是订阅的RSS倒也没扔下,坚持读一读,今天这篇文章就是根据msdn博客的一篇博文写成的,只是添加了一些代码,有愿意看英文的请移步到这里。
从Vista开始,想阻止系统关机就开始变麻烦了,不能只拦截WM_QUERYENDSESSION了,操作系统只给一个应用程序两秒钟的时间去保存自己的东西,两秒钟之后,不管做完了没有,Game Over!可是如果你正在刻录一张光盘呢?两秒钟是都不够的,所以Vista之后也给提供了一种方式阻止系统关机,就是ShutdownBlockReasonCreate函数,只要调用这个函数,第一个参数传递创建主窗口的句柄,第二个参数传递一个字符串,这个字符串说明阻止关机的原因,将会显示给用户。而且msdn提示说这个API函数只能由创建主窗口的线程调用,否则将返回ERROR_ACCESS_DENIED。而且完成后还得调用ShutdownBlockReasonDestroy函数使系统关机能够继续进行,参数只传递上面那个窗口的句柄就可以了。
下面这段代码就是完整实现,不能使用VS2005编译,因为自带的库还没有这俩函数,我是使用VS2010编译的,工程文件和可执行文件的下载地址在文章最下方。
下图就是运行效果。
上面这个图应该很多人看到过,只是通常刚一显示就消失了,这样就不会消失了,直到程序调用了ShutdownBlockReasonDestroy。
还有一点需要注意的是,如果你的电脑安装了360安全卫士orQQ电脑管家等优化软件,通常都会一键优化给优化掉……你就看不到这个对话框了,程序直接被枪毙掉了,因为这样可以加快关机速度 :-(
完整的C语言工程和可执行程序文件都在压缩包里,为了方便没装VS2010的童鞋测试程序效果,msvcr100.dll我也放到release目录下了,下载地址是http://files.cnblogs.com/pianoid/ShutdownBlocker.rar。
从Vista开始,想阻止系统关机就开始变麻烦了,不能只拦截WM_QUERYENDSESSION了,操作系统只给一个应用程序两秒钟的时间去保存自己的东西,两秒钟之后,不管做完了没有,Game Over!可是如果你正在刻录一张光盘呢?两秒钟是都不够的,所以Vista之后也给提供了一种方式阻止系统关机,就是ShutdownBlockReasonCreate函数,只要调用这个函数,第一个参数传递创建主窗口的句柄,第二个参数传递一个字符串,这个字符串说明阻止关机的原因,将会显示给用户。而且msdn提示说这个API函数只能由创建主窗口的线程调用,否则将返回ERROR_ACCESS_DENIED。而且完成后还得调用ShutdownBlockReasonDestroy函数使系统关机能够继续进行,参数只传递上面那个窗口的句柄就可以了。
下面这段代码就是完整实现,不能使用VS2005编译,因为自带的库还没有这俩函数,我是使用VS2010编译的,工程文件和可执行文件的下载地址在文章最下方。
#include <windows.h> #include <tchar.h> #include "resource.h" //标记是否已经阻止关机,默认为未阻止 BOOL blockedFlag = FALSE; //这俩函数纯粹是撒娇,为了突出它们才拿出来改个名的 BOOL BlockShutdown(HWND hwnd) { if (ShutdownBlockReasonCreate(hwnd, _T("不准关机!除非你点强制关机 :-("))) { return TRUE; } return FALSE; } BOOL UnblockShutdown(HWND hwnd) { if (ShutdownBlockReasonDestroy(hwnd)) { return TRUE; } return FALSE; } INT_PTR CALLBACK MainDialogProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) { switch(uMsg) { case WM_INITDIALOG: SetDlgItemText(hwndDlg, IDC_STATIC_STATUS, _T("未阻止关机")); return TRUE; case WM_CLOSE: if (blockedFlag) { if (UnblockShutdown(hwndDlg)) { EndDialog(hwndDlg, 0); return TRUE; } if (IDYES == MessageBox(hwndDlg, _T("解除阻止失败……还要继续关闭程序么(关闭程序后不影响关机)?"), _T("提示"), MB_YESNO)) { EndDialog(hwndDlg, 0); return TRUE; } return FALSE; } EndDialog(hwndDlg, 0); return TRUE; case WM_QUERYENDSESSION: if (blockedFlag) //不要以为只调用BlockShutdownReasonCreate就行了,WM_QUERYENDSESSION也得拦住 { return TRUE; } return FALSE; case WM_COMMAND: switch(LOWORD(wParam)) { case IDC_BUTTON_BLOCK: if (blockedFlag) { MessageBox(hwndDlg, _T("已经阻止关机,请点击关机测试。"), _T("提示"), MB_OK); } else { if (BlockShutdown(hwndDlg)) { SetDlgItemText(hwndDlg, IDC_STATIC_STATUS, _T("已经阻止关机")); blockedFlag = TRUE; } else { MessageBox(hwndDlg, _T("阻止关机失败了……"), _T("提示"), MB_OK); } } return TRUE; case IDC_BUTTON_UNBLOCK: if (!blockedFlag) { MessageBox(hwndDlg, _T("未阻止关机,无需解除。"), _T("提示"), MB_OK); } else { if (UnblockShutdown(hwndDlg)) { SetDlgItemText(hwndDlg, IDC_STATIC_STATUS, _T("未阻止关机")); blockedFlag = FALSE; } else { MessageBox(hwndDlg, _T("解除阻止失败了……"), _T("提示"), MB_OK); } } return TRUE; default: return FALSE; } default: return FALSE; } return FALSE; } int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd) { DialogBox(hInstance, MAKEINTRESOURCE(IDD_MAINDIALOG), NULL, MainDialogProc); return 0; }
下图就是运行效果。
上面这个图应该很多人看到过,只是通常刚一显示就消失了,这样就不会消失了,直到程序调用了ShutdownBlockReasonDestroy。
还有一点需要注意的是,如果你的电脑安装了360安全卫士orQQ电脑管家等优化软件,通常都会一键优化给优化掉……你就看不到这个对话框了,程序直接被枪毙掉了,因为这样可以加快关机速度 :-(
完整的C语言工程和可执行程序文件都在压缩包里,为了方便没装VS2010的童鞋测试程序效果,msvcr100.dll我也放到release目录下了,下载地址是http://files.cnblogs.com/pianoid/ShutdownBlocker.rar。
相关文章推荐
- Windows 7下阻止系统关机 分类: windows驱动程序WDM 2014-04-29 14:43 562人阅读 评论(1) 收藏
- Windows 7下阻止系统关机
- Windows 7下阻止系统关机
- Windows 7下阻止系统关机
- U盘安装CentOS 6.4 + Windows 7双系统 (Windows 7下安装 CentOS 6.4)
- 简单实现windows系统普通或强制关机重启注销的功能
- Windows系统关机故障不求人
- windows系统打开网页被阻止通过windws防火墙可以轻松解决
- DELPHI实现关机,兼容全部WINDOWS系统
- Windows上次系统关机时间与本次系统运行时间
- windows系统提高关机速度减少关机时间小窍门
- windows 7系统实现一键关机的方法
- 如何阻止windows关机?
- C++, Qt Windows关机的时候,阻止其关机或这注销 做其它业务的解决方法
- U盘安装CentOS 6.4 + Windows 7双系统 (Windows 7下安装 CentOS 6.4)
- windows 7下进入System帐号并运行桌面系统
- 在Closing事件中,将e.Cancle设置成true,则Windows无法关机和重启系统的解决办法
- 不重新安装系统,把Windows7下硬盘模式从IDE调整为AHCI
- 处理WM_QUERYENDSESSION 阻止Windows关机事件
- U盘安装CentOS 6.4 + Windows 7双系统 (Windows 7下安装 CentOS 6.4)