zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    如何阅读大型代码库?
    发现一个时隐时现的bug!
    写给开发者:记录日志的10个建议
    教你一眼认出英语单词的意思
    为什么我要使用一个20年前的IBM老键盘
    有了screen,妈妈再也不用担心我的学习啦
    一次优秀的代码提交应该包含什么?
    你需要的不是重构,而是理清业务逻辑
    Android中监听ListView滑动到底部
    Android中的Handler,Looper,Message机制
  • 原文地址:https://www.cnblogs.com/fps2tao/p/15715360.html
Copyright © 2011-2022 走看看