C# 系统关闭时强制应用程序关闭

C# 系统关闭时强制应用程序关闭,c#,winforms,shutdown,C#,Winforms,Shutdown,我有一个Windows窗体应用程序,当主窗口关闭时,它会显示一个基本对话框,确认操作。如果用户决定取消,则取消应用程序退出 但是,当应用程序运行最小化并且用户希望关闭电脑时,关闭顺序停止,因为我的应用程序正在等待用户确认应用程序关闭(显示对话框) 我曾想过添加一个计时器来超时,如果在一定时间内没有应答,则自动关闭应用程序,但即使这是一种方式,也肯定不是其他应用程序都是这样做的 那么,除非系统正在关闭,否则在其他情况下,有什么最佳的解决方案来确认应用程序关闭 谢谢大家! 在FormClosing事

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

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

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

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


谢谢大家!

在FormClosing事件中,检查“属性”以查看窗口关闭的原因。如果是
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. 
    }
}

N.B:您可能还希望包括
CloseReason.taskmanager关闭
,因为用户显然希望在该场景中关闭您的应用程序,而taskmanager已经要求确认。或者只显示
CloseReason.UserClosing
的对话框

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

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


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

    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
        }
    }

SystemEvents可以帮助您。当用户试图注销或关闭系统时,会发生SessionEnding

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

非常感谢你。这对我帮助很大!同上,对我的情况很有用-为缺少验证的应用程序提供一个“替换”UI,并且电脑被锁定,如果你关闭它,你就无法重新启动应用程序。