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

时间:2011-11-15 13:29:04

标签: c# winforms shutdown

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

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

我想添加一个用于超时的计时器,如果在一定时间内没有答案,请自动关闭应用程序,但即使这是一种方法,它肯定不是每个其他应用程序如何做到这一点

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

谢谢!

5 个答案:

答案 0 :(得分:47)

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

N.B:您可能还想要包含CloseReason.TaskManagerClosing,因为用户显然希望在该方案​​中关闭您的应用程序,并且任务管理员已经要求确认。或者只显示CloseReason.UserClosing的对话框。

答案 1 :(得分:9)

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

答案 2 :(得分:6)

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

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

答案 3 :(得分:1)

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

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

答案 4 :(得分:0)

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