我有一个Winforms应用程序,当用户点击X时,它最小化到任务栏。它不会阻止用户注销。
另一方面,我有一个应用程序,当用户点击X时显示一个对话框, 阻止注销显示:
"此应用阻止您退出。"
我已经尝试追踪它们之间究竟有什么区别,但却找不到差异。我认为这将是对话框,但测试应用程序已经表明,无论如何应用程序在e.Cancel = true;
中设置FormClosing
- 测试应用程序都会阻止注销。如果应用程序显示对话框,并且ShowInTaskbar
是真还是假,则无关紧要。如果Cancel
,则应用和测试应用仅e.CloseReason == CloseReason.UserClosing
。
所以基本上我问的是e.Cancel = true
不什么时候阻止注销?
答案 0 :(得分:1)
如果应用程序显示对话框,则无关紧要......只有
才能取消应用和测试应用e.CloseReason == CloseReason.UserClosing
至关重要的是,您是否展示对话并不重要。在第一个应用中,您完全 不 调用e.Cancel == true;
,因为e.CloseReason
不是UserClosing
,而是{ {1}}。
<强> 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;