在系统关闭时强制关闭应用程序

Posted

技术标签:

【中文标题】在系统关闭时强制关闭应用程序【英文标题】:Force application close on system shutdown 【发布时间】:2011-12-29 12:57:45 【问题描述】:

我有一个 Windows 窗体应用程序,当主窗口关闭时,它会显示一个基本对话框,确认操作。如果用户决定取消应用程序退出将被取消。

但是,当应用程序最小化运行并且用户想要关闭 PC 时,关闭顺序会停止,因为我的应用程序正在等待用户确认应用程序关闭(显示对话框)。

我想添加一个计时器来进行超时,如果在一定时间内没有响应,则自动关闭应用程序,但即使这是一种方法,也肯定不是每个其他应用程序都是这样做的.

那么在其他情况下确认应用程序关闭的最佳解决方案是什么,除非系统正在关闭?

谢谢!

【问题讨论】:

【参考方案1】:

在您的 FormClosing 事件中检查 FormClosingEventArgs' CloseReason 属性以查看窗口关闭的原因。如果是CloseReason.WindowsShutDown,则不要显示对话框,也不要取消关闭表单。

private void MyForm_FormClosing(object sender, FormClosingEventArgs e)

    // Verify that we're not being closed because windows is shutting down.
    if (e.CloseReason != CloseReason.WindowsShutDown)
    
        // Show your dialog / cancel closing. 
    

注意:您可能还想包含CloseReason.TaskManagerClosing,因为用户显然希望在这种情况下关闭您的应用程序,并且任务管理器已经要求确认。或者只显示CloseReason.UserClosing 的对话框。

【讨论】:

非常感谢。这对我帮助很大!【参考方案2】:

在 Closing 事件处理程序中,您可以这样定义:

    this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.Form1_FormClosing);

我猜你是在发布确认对话框的地方,你可以检查 CloseReason 参数,如果是关机导致它,则不要发布对话框:

    private void Form1_FormClosing(object sender, FormClosingEventArgs e)
    
        if (e.CloseReason == CloseReason.WindowsShutDown)
        
            //do not show the dialog
        
    

【讨论】:

【参考方案3】:

SystemEvents 可以帮助您。 SessionEnding 在用户尝试注销或关闭系统时发生。

Microsoft.Win32.SystemEvents.SessionEnding += (sender, e) => DoYourJob();

【讨论】:

同上,对我的情况很有用 - 为缺少验证的应用程序提供“替换”用户界面,并且 PC 被锁定,如果关闭它,您将无法重新启动应用程序。【参考方案4】:

您可以使用 Application.SessionEnding 事件来了解系统是否即将关闭

http://msdn.microsoft.com/en-us/library/system.windows.application.sessionending.aspx

【讨论】:

【参考方案5】:

您可以收听shutdown event 并在没有消息框的情况下退出应用程序。

【讨论】:

以上是关于在系统关闭时强制关闭应用程序的主要内容,如果未能解决你的问题,请参考以下文章

内存不足时Android应用程序强制关闭

如何强制系统关闭底层套接字

如何强制关闭Ubuntu无响应程序

mac电脑小技巧:快速强制关闭苹果Mac电脑后台程序

应用程序强制在启动时关闭

如何处理离子应用程序中的强制关闭事件?