设为首页 收藏本站
查看: 782|回复: 0

Windows 7下阻止系统关机

[复制链接]

尚未签到

发表于 2015-5-10 07:16:31 | 显示全部楼层 |阅读模式
  好长时间不更新博客了,今天终于把毕业设计答辩完了,虽然没完全做到自己预先设定的目标,但是起码算是效果出来了。虽然很长时间不更博客,但是订阅的RSS倒也没扔下,坚持读一读,今天这篇文章就是根据msdn博客的一篇博文写成的,只是添加了一些代码,有愿意看英文的请移步到这里。
  从Vista开始,想阻止系统关机就开始变麻烦了,不能只拦截WM_QUERYENDSESSION了,操作系统只给一个应用程序两秒钟的时间去保存自己的东西,两秒钟之后,不管做完了没有,Game Over!可是如果你正在刻录一张光盘呢?两秒钟是都不够的,所以Vista之后也给提供了一种方式阻止系统关机,就是ShutdownBlockReasonCreate函数,只要调用这个函数,第一个参数传递创建主窗口的句柄,第二个参数传递一个字符串,这个字符串说明阻止关机的原因,将会显示给用户。而且msdn提示说这个API函数只能由创建主窗口的线程调用,否则将返回ERROR_ACCESS_DENIED。而且完成后还得调用ShutdownBlockReasonDestroy函数使系统关机能够继续进行,参数只传递上面那个窗口的句柄就可以了。
  下面这段代码就是完整实现,不能使用VS2005编译,因为自带的库还没有这俩函数,我是使用VS2010编译的,工程文件和可执行文件的下载地址在文章最下方。



  1 #include
  2 #include
  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 }
  下图就是运行效果。
DSC0000.jpg
  上面这个图应该很多人看到过,只是通常刚一显示就消失了,这样就不会消失了,直到程序调用了ShutdownBlockReasonDestroy。
  还有一点需要注意的是,如果你的电脑安装了360安全卫士orQQ电脑管家等优化软件,通常都会一键优化给优化掉……你就看不到这个对话框了,程序直接被枪毙掉了,因为这样可以加快关机速度 :-(
  完整的C语言工程和可执行程序文件都在压缩包里,为了方便没装VS2010的童鞋测试程序效果,msvcr100.dll我也放到release目录下了,下载地址是http://files.iyunv.com/pianoid/ShutdownBlocker.rar。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-65363-1-1.html 上篇帖子: Microsoft Press ebook--Programming Windows Phone 7 下篇帖子: windows phone 7获得当前使用网络类型(设备是否通过zune与PC相连)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表