什么时候' e.Cancel = true'在FormClosing中不阻止注销?

时间:2018-05-15 19:59:20

标签: c# .net winforms

我有一个Winforms应用程序,当用户点击X时,它最小化到任务栏。它不会阻止用户注销。

另一方面,我有一个应用程序,当用户点击X时显示一个对话框, 阻止注销显示:

  

"此应用阻止您退出。"

我已经尝试追踪它们之间究竟有什么区别,但却找不到差异。我认为这将是对话框,但测试应用程序已经表明,无论如何应用程序在e.Cancel = true;中设置FormClosing - 测试应用程序都会阻止注销。如果应用程序显示对话框,并且ShowInTaskbar是真还是假,则无关紧要。如果Cancel,则应用和测试应用仅e.CloseReason == CloseReason.UserClosing

所以基本上我问的是e.Cancel = true 什么时候阻止注销?

1 个答案:

答案 0 :(得分:1)

  

如果应用程序显示对话框,则无关紧要......只有e.CloseReason == CloseReason.UserClosing

才能取消应用和测试应用

至关重要的是,您是否展示对话并不重要。在第一个应用中,您完全 调用e.Cancel == true;,因为e.CloseReason不是UserClosing,而是{ {1}}。

根据documentation

  

<强> UserClosing

     

用户正在通过用户界面(UI)关闭表单   例如,单击表单窗口上的关闭按钮,选择   从窗口的控制菜单中关闭,或按ALT + F4。

您可以通过运行如下所示的简单测试来确认 实际上是WindowsShutDown

WindowsShutDown

如果您想阻止关闭/注销,可以将private void Form1_FormClosing(object sender, FormClosingEventArgs e) { System.IO.File.WriteAllText(@"D:\SomePath\CloseReason.txt", e.CloseReason.ToString()); if (e.CloseReason == CloseReason.UserClosing) e.Cancel = true; } 设置为e.Cancel,无条件,或检查是否true

e.CloseReason == CloseReason.WindowsShutDown

但是,请负责任地使用此功能,并注意用户可以按照this answer中的说明始终强制关闭/注销。

修改

另一方面,如果您有一些逻辑可能会阻止表单关闭(即通过调用private void Form1_FormClosing(object sender, FormClosingEventArgs e) { // e.Cancel = true; // Or.. if (e.CloseReason == CloseReason.UserClosing || e.CloseReason == CloseReason.WindowsShutDown) { e.Cancel = true; } } )并且您不希望在关闭时应用该逻辑(或记录日志)我总是使用以下内容:

e.Cancel = true;