Sam*_*mir 5 c# taskmanager detect application-close winforms
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
if (e.CloseReason == CloseReason.UserClosing)
{
if (MessageBox.Show(this, "Do you really want to close?", "Close?",
MessageBoxButtons.YesNo) == DialogResult.No)
{
e.Cancel = true;
}
}
}
Run Code Online (Sandbox Code Playgroud)
因此,当我想关闭应用程序时,单击关闭按钮,消息框会按其应有的方式显示,然后我选择了“否”。然后执行 e.Cancel = true 行并且表单未关闭。
现在的问题是,在此之后,如果我从任务管理器关闭应用程序,关闭原因是 UserClosing !为什么?不应该是TaskManagerClosing吗?
我找到了一个线程,其中有我们自己的nobugz 的答案:
Windows 窗体无法检测到关闭原因来自任务管理器。因此它会自动将 CloseReason.None 转换为 CloseReason.TaskManagerClosing。问题是,一旦您尝试使用“X”关闭,CloseReason 就会设置为 UserClosing,并且如果您取消关闭,则不会重置回 None。马虎。
接下来,另一个用户解释了如何使用 Reflection 将 e.CloseReason 的值更改为 None(因为它是只读的),以解决此问题(这应该在将 e.Cancel 设置为 True 时应用) :
FieldInfo fi = typeof(Form).GetField("closeReason", BindingFlags.Instance | BindingFlags.NonPublic);
fi.SetValue(this, CloseReason.None);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2382 次 |
| 最近记录: |