当前位置 博文首页 > zcy_wxy的博客:C# 捕获关机事件方法

    zcy_wxy的博客:C# 捕获关机事件方法

    作者:[db:作者] 时间:2021-08-04 08:51

    方法一:

    private const int WM_QUERYENDSESSION = 0x0011;
    
    /// <summary>
    /// 窗口过程的回调函数
    /// </summary>
    ///<param name="m">
    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;
    	}
    }

    ?

    cs
    下一篇:没有了