2011-11-15 64 views
25

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

然而,当应用程序运行时最小化,用户要关闭电脑,关闭顺序停止,因为我的应用程序正在等待用户确认的应用程序关闭(显示对话框)。

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

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

谢谢!

回答

46

在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

+1因为我也学到了一些东西:-) –

+0

非常感谢**。这帮了我很多! –

0

您可以听取shutdown event并退出没有消息框的应用程序。

9

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

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

和在这里我想你可以发布您的确认对话框,你可以检查theCloseReason的说法,而不是发布对话框,如果它是导致它关机:

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

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

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

+1 SystemEvents,真棒我不知道这些。 –

+0

同上,我的情况非常有用 - 提供“替代”用户界面缺乏验证的应用程序,而PC是如此锁定的,如果你关闭它,你不能重新启动应用程序。 –