在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; } } } 

因此,当我想关闭应用程序时,单击关闭按钮会显示消息框,然后我选择否。 然后执行e.Cancel = true行并且不关闭表单。

现在问题是,在此之后如果我从任务管理器关闭应用程序,关闭原因是UserClosing !!! 为什么? 不应该是TaskManagerClosing吗?

我找到了一个由我们自己的nobugz回答的post :

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); 

请参阅此问题的答案 ,该问题使用CloseReason.TaskManagerClosing来捕获相同内容。

只是你在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