捕获关机

C#捕获windows关机事件,在系统关机前做一些自己想做的事;

有些时候我们可能想在Windows关机时记录或处理一些事情,这里提供几种方法。

方法一:

 1 /// <summary>
 2 /// 窗口过程的回调函数
 3 /// </summary>
 4 ///<param name="m">
 5 protected override void WndProc(ref Message m)
 6 {
 7     switch (m.Msg)
 8     {
 9         //此消息在OnFormClosing之前
10         case WindowsMessage.WM_QUERYENDSESSION:
11             //MessageBox.Show(WndProc.WM_QUERYENDSESSION.我要阻止系统关闭!);
12             //this.Close();
13             //this.Dispose();
14             //Application.Exit();
15             m.Result = (IntPtr)1; //阻止Windows注销、关机或重启
16             break;
17         default:
18             break;
19     }
20     base.WndProc(ref m);
21 }

方法二:

 1 protected override void OnFormClosing(FormClosingEventArgs e)
 2 {
 3     switch (e.CloseReason)
 4     {
 5         case CloseReason.ApplicationExitCall:
 6             e.Cancel = true;
 7             MessageBox.Show(拦截关闭要求事件!);
 8             break;
 9         case CloseReason.FormOwnerClosing:
10             e.Cancel = true;
11             MessageBox.Show(拦截自身关闭事件!);
12             break;
13         case CloseReason.MdiFormClosing:
14             e.Cancel = true;
15             MessageBox.Show(拦截MDI窗体关闭事件!);
16             break;
17         case CloseReason.None:
18             break;
19         case CloseReason.TaskManagerClosing:
20             e.Cancel = true;
21             MessageBox.Show(拦截任务管理器关闭事件!);
22             break;
23         case CloseReason.UserClosing:
24
25             //注销或关机会触发此事件;
26             //MessageBox.Show(拦截用户关闭事件!);
27             e.Cancel = false;
28             break;
29         case CloseReason.WindowsShutDown:
30             e.Cancel = true;
31             MessageBox.Show(拦截关机事件!);
32             break;
33         default:
34             break;
35     }
36
37     base.OnFormClosing(e);
38 }

方法三:

 1 //当用户试图注销或关闭系统时发生。
 2             SystemEvents.SessionEnding += new SessionEndingEventHandler(SystemEvents_SessionEnding);
 3
 4 //下面是系统注销或关闭事件处理程序,
 5         private void SystemEvents_SessionEnding(object sender, SessionEndingEventArgs e)
 6         {
 7             if (MessageBox.Show(this, 是否允许系统注销!, 系统提示, MessageBoxButtons.YesNo) != DialogResult.Yes)
 8             {
 9                 e.Cancel = true;
10             }
11             else
12             {
13                 e.Cancel = false;
14             }
15             SessionEndReasons reason = e.Reason;
16             switch (reason)
17             {
18                 case SessionEndReasons.Logoff:
19                     MessageBox.Show(用户正在注销。操作系统继续运行,但启动此应用程序的用户正在注销。);
20                     break;
21                 case SessionEndReasons.SystemShutdown:
22                     MessageBox.Show(操作系统正在关闭。);
23                     break;
24             }
25         }
26         //如果把上面的事件处理程序修改成如下
27         //private void SystemEvents_SessionEnding(object sender, SessionEndingEventArgs e)
28         //       {
29         //          e.Cancel = true;
30         //   }
31
32         //那会出现什么情况,你点击开始菜单关机选择注销、关机、或重新启动将会失效,电脑不能正常关机了,进一步的话把程序做成Windows服务,晕,恶作剧?
33
34         //SessionEnded事件同上,事件参数类为SessionEndedEventArgs,同SessionEndingEventArgs相比少了Cancel属性,Cancel属性同一些windows下的某些事件差不多,比如Form.Closing事件,Control.Validating事件。
35
36         //补充,如果需要获取应用程序需要的系统信息,可以访问System.Windows.Forms.

原文地址:https://www.cnblogs.com/pugongying123/p/8327583.html

时间: 2024-11-05 20:24:59

捕获关机的相关文章

VC实现字符串分割的函数strtok

Python网络爬虫-正则表达式 分享第二套C语言源代码合集 vc++6.0如何捕获关机事件并执行我自己的代码 浅谈面向对象--<ThinkinginJava>读书笔记(一) zv5拙侔号http://p.baidu.com/pai/center?uid=e97061626332393034363011aa&type=qq35kx踊泻蓖7tsuhd副战追http://p.baidu.com/pai/center?uid=78e261626333363962616211aa&ty

虚拟化入门

一.虚拟化技术入门 虚拟化:计算机:CPU,memory,IO(disk networkk),...emulation:纯软件方式实现 //模拟virtulation:把硬件功能分割成多份//拥有一个VMM进行管理分配完全虚拟化:full-virt半虚拟化:para-virt 完全虚拟化: [v1.user][v1.ker ] =========================== |内核| 用户空间| | | [硬件] V1发起的特权指令,不能直接操作硬件//否则会影响其他虚拟机或者物理机 完

C#捕获windows关机事件,在系统关机前做一些自己想做的事

C#捕获windows关机事件,在系统关机前做一些自己想做的事: 有些时候我们可能想在Windows关机时记录或处理一些事情,这里提供几种方法. 方法一: /// <summary> /// 窗口过程的回调函数 /// </summary> /// <param name="m"></param> protected override void WndProc(ref Message m) { switch (m.Msg) { //此消息

DHCP获取IP地址过程中捕获的报文—三级网络总结(二)

上一篇文章主要说了一下知识点中的IP地址的考点,这一篇我打算说说DHCP获取IP地址过程中捕获的报文的这个考点,都是自己的理解,有错误欢迎指正. DHCP是应用层协议,UDP是传输层协议,IP是网络层协议,以太网是链路层协议.数据在网络上传输的时候要自顶向下逐层封装的,典型的DHCP过程是这样的: 1:客户机向服务器发送DHCP_DISCOVER报文,申请IP. 2:服务器向客户机返会DHCP_OFFER报文,指定一个将要分配的IP. 3:客户机向服务器发送DHCP_REQUEST报文,请求这个

深入windows的关机消息截获-从XP到Win7的变化(在XP中程序可以阻止关机,但是在Win7中程序无法阻止关机,可Block的时间从1秒调到了5秒) good

之前写了一个软件用于实验室的打卡提醒,其中一个重要的功能是在关机之前提醒当天晚上是否已经打卡.之前我是在WM_ENDSESSION中弹出一个模态对话框来提醒,在XP中基本工作正常,在Win7中大多数时候工作正常,但是有时候会出现不提醒现象.我想这中间是不是有什么玄机,Windows的关机方案从XP到Win7到底发生了什么变化,如何进行有效的截获Windows关机消息.对此,我搜寻了MSDN和网上论坛结合自己的测评给出一个完善的描述和解决方案,如果你有类似的需求,可以参考这篇文章. 在MSDN中对

C#之关机事件

一.背景 做了个APP,通过向下位机发送串口数据,然后通过开关机去控制多路光源,现在的问题来了,若是电脑强行关机,而APP又没在电脑关机前做任何动作,导致电脑关机了,而下位机控制的灯源还在工作.所以需要C#在截获到关机信息时发送串口数据通知下位机关闭灯源. 二.正文 在"Form1.cs[设计]"界面下,选中要截获关机信息的窗体.(所写的APP只有一个窗体,所以没有父子窗体概念.)在右下角的属性框点击"事件",并选中"FormClosing",如

深入windows的关机消息截获-从XP到Win7的变化

之前写了一个软件用于实验室的打卡提醒,其中一个重要的功能是在关机之前提醒当天晚上是否已经打卡.之前我是在WM_ENDSESSION中弹出一个模态对话框来提醒,在XP中基本工作正常,在Win7中大多数时候工作正常,但是有时候会出现不提醒现象.我想这中间是不是有什么玄机,Windows的关机方案从XP到Win7到底发生了什么变化,如何进行有效的截获Windows关机消息.对此,我搜寻了MSDN和网上论坛结合自己的测评给出一个完善的描述和解决方案,如果你有类似的需求,可以参考这篇文章. 在MSDN中对

trap能够捕获的一些重要信号

HUP(1) 挂起,通常因终端掉线或用户退出而引发 INT(2) 中断,通常因按下Ctrl+C 组合键而引发 QUIT(3) 退出,通常因按下Ctrl+\组合键而引发 ABRT(6) 中止,通常因某些严重的执行错误而引发 ALRM(14) 报警,通常用来处理超时 TERM(15) 终止,通常在系统关机时发送 trap能够捕获的一些重要信号

Windows 系统关机、重启、睡眠、休眠及唤醒消息

今天要查找如何获取系统从睡眠.休眠状态下唤醒的消息,写了个MFC对话框的程序,贴出部分核心代码: //唤醒消息捕获 LRESULT CSystemResumedMessageDlg::WindowProc(UINT message, WPARAM wParam, LPARAM lParam) { // TODO: 在此添加专用代码和/或调用基类 if ((message == WM_POWERBROADCAST) && (wParam == PBT_APMRESUMEAUTOMATIC))