1. 程式人生 > 其它 >C#捕獲windows關機事件,在系統關機前做一些自己想做的事

C#捕獲windows關機事件,在系統關機前做一些自己想做的事

C#捕獲windows關機事件,在系統關機前做一些自己想做的事;

有些時候我們可能想在Windows關機時記錄或處理一些事情,這裡提供幾種方法。

方法一:

        /// <summary>
        /// 視窗過程的回撥函式
        /// </summary>
        /// <param name="m"></param>
        protected override void WndProc(ref Message m)
        {
            const int WM_ENDSESSION = 0x0016;
            
const int WM_QUERYENDSESSION = 0x0011; switch (m.Msg) { //此訊息在OnFormClosing之前 case WM_QUERYENDSESSION: //WindowsMessage.WM_QUERYENDSESSION: MessageBox.Show("WndProc.WM_QUERYENDSESSION.我要阻止系統關閉!"); //this.Close();
//this.Dispose(); //Application.Exit(); m.Result = (IntPtr)1; //阻止Windows登出、關機或重啟 break; case WM_ENDSESSION: MessageBox.Show("WndProc.WM_ENDSESSION.我要阻止系統關閉!"); 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類,這也是一個很有用的類,它提供了一組靜態屬性。

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