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

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

https://blog.csdn.net/testcs_dn/article/details/42365381

标签: C# 捕获 windows 关机事件 WndProc
 分类:

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

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

方法一:

 

[csharp] view plain copy
 
  1. /// <summary>  
  2. /// 窗口过程的回调函数  
  3. /// </summary>  
  4. /// <param name="m"></param>  
  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. }  
方法二:
[csharp] view plain copy
 
  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. }  
方法三:

 

 

[csharp] view plain copy
 
  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.SystemInformation类,这也是一个很有用的类,它提供了一组静态属性。  
但在调试时并没有执行到这里!

 

posted @ 2018-04-16 16:02  sky20080101  阅读(498)  评论(0)    收藏  举报