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.