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;
}
}
}
因此,当我想关闭应用程序时,单击关闭按钮会显示消息框,然后我选择了否。然后执行e.Cancel = true行,表格未关闭。
现在问题是,在此之后如果我从任务管理器关闭应用程序,关闭原因是UserClosing !!!为什么?不应该是TaskManagerClosing吗?
答案 0 :(得分:2)
我找到了一个thread,并通过我们自己的nobugz找到答案:
Windows窗体无法检测到 密切的理由来自任务 经理。所以它是自动的 将CloseReason.None翻译为 CloseReason.TaskManagerClosing。 问题是,一旦你试图关闭 使用“X”,设置CloseReason 到UserClosing并且不会重置 如果您取消关闭,则返回“无”。 马虎。
在它旁边,另一个用户解释如何使用Reflection将e.CloseReason的值更改为None(因为它是只读的),以解决此问题(这应该在设置e.Cancel时应用到真):
FieldInfo fi = typeof(Form).GetField("closeReason", BindingFlags.Instance | BindingFlags.NonPublic);
fi.SetValue(this, CloseReason.None);
答案 1 :(得分:0)
请参阅answer此问题,该问题使用CloseReason.TaskManagerClosing
来捕获相同内容。
答案 2 :(得分:0)
只需在VB中翻译代码:
Imports System.Reflection
Private Sub ResetCloseReason()
Dim myFieldInfo As FieldInfo
Dim myType As Type = GetType(Form)
myFieldInfo = myType.GetField("closeReason", BindingFlags.NonPublic Or _
BindingFlags.Instance Or BindingFlags.Public)
myFieldInfo.SetValue(Me, CloseReason.None)
End Sub