捕获关机

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.

 

posted @ 2018-01-22 09:39  奔跑的蒲公英  阅读(255)  评论(0编辑  收藏  举报