时间:2015-1-13来源:不详作者:佚名
收藏    我要投稿

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

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

方法一:

 

        /// 
        /// 窗口过程的回调函数
        /// 
        ///
        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类,这也是一个很有用的类,它提供了一组静态属性。
但在调试时并没有执行到这里!

 

 


转载请注明原文网址:http://www.helimiaopu.com/cxfz/cxfz/2.html
------分隔线----------------------------