C#捕獲windows關機事件,在系統關機前做一些自己想做的事;
有些時候我們可能想在Windows關機時記錄或處理一些事情,這裡提供幾種方法。
方法一:
/// <summary> /// 視窗過程的回呼函數 /// </summary> /// <param name="m"></param> protected override void WndProc(ref Message m) { switch (m.Msg) { //此訊息在OnFormClosing之前 case WindowsMessage.WM_QUERYENDSESSION: //MessageBox.Show("WndProc.WM_QUERYENDSESSION.我要阻止系統關閉!"); //this.Close(); //this.Dispose(); //Application.Exit(); m.Result = (IntPtr)1; //阻止Windows登出、關機或重啟 break; default: break; } base.WndProc(ref m); }
方法二:
protected override void OnFormClosing(FormClosingEventArgs e) { switch (e.CloseReason) { case CloseReason.ApplicationExitCall: e.Cancel = true; MessageBox.Show("攔截關閉要求事件!"); break; case CloseReason.FormOwnerClosing: e.Cancel = true; MessageBox.Show("攔截自身關閉事件!"); break; case CloseReason.MdiFormClosing: e.Cancel = true; MessageBox.Show("攔截MDI表單關閉事件!"); break; case CloseReason.None: break; case CloseReason.TaskManagerClosing: e.Cancel = true; MessageBox.Show("攔截工作管理員關閉事件!"); break; case CloseReason.UserClosing: //登出或關機會觸發此事件; //MessageBox.Show("攔截使用者關閉事件!"); e.Cancel = false; break; case CloseReason.WindowsShutDown: e.Cancel = true; MessageBox.Show("攔截關機事件!"); break; default: break; } base.OnFormClosing(e); }
方法三:
//當使用者試圖登出或關閉系統時發生。 SystemEvents.SessionEnding += new SessionEndingEventHandler(SystemEvents_SessionEnding);//下面是系統登出或關閉事件處理常式, private void SystemEvents_SessionEnding(object sender, SessionEndingEventArgs e) { if (MessageBox.Show(this, "是否允許系統登出!", "系統提示", MessageBoxButtons.YesNo) != DialogResult.Yes) { e.Cancel = true; } else { e.Cancel = false; } SessionEndReasons reason = e.Reason; switch (reason) { case SessionEndReasons.Logoff: MessageBox.Show("使用者正在登出。作業系統繼續運行,但啟動此應用程式的使用者正在登出。"); break; case SessionEndReasons.SystemShutdown: MessageBox.Show("作業系統正在關閉。"); break; } } //如果把上面的事件處理常式修改成如下 //private void SystemEvents_SessionEnding(object sender, SessionEndingEventArgs e) // { // e.Cancel = true; // } //那會出現什麼情況,你點擊開始菜單關機選擇登出、關機、或重新啟動將會失效,電腦不能順利關機了,進一步的話把程式做成Windows服務,暈,惡作劇? //SessionEnded事件同上,事件參數類為SessionEndedEventArgs,同SessionEndingEventArgs相比少了Cancel屬性,Cancel屬性同一些windows下的某些事件差不多, 比如Form.Closing事件,Control.Validating事件。 //補充,如果需要擷取應用程式需要的系統資訊,可以訪問System.Windows.Forms.SystemInformation類,這也是一個很有用的類,它提供了一組靜態屬性。