C# 捕获关机事件方法

这篇文章是在互联网搜索到的,但是很多文章都没有给 WM_QUERYENDSESSION赋值这句话,所以重新整理了一下

/// <summary>

/// 窗口过程的回调函数
/// </summary>

///<param name="m">

 private const int WM_QUERYENDSESSION = 0x0011;

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事件。
  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值