4
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吗?

4

3 回答 3

3

我找到了一个由我们自己的nobugz回答的线程

Windows 窗体无法检测到关闭原因来自任务管理器。所以它会自动将 CloseReason.None 转换为 CloseReason.TaskManagerClosing。问题是,一旦您尝试使用“X”关闭,CloseReason 将设置为 UserClosing,并且如果您取消关闭,则不会重置回 None。邋遢。

在它旁边,另一个用户解释了如何使用反射将 e.CloseReason 的值更改为 None(因为它是只读的),以解决这个问题(这应该在将 e.Cancel 设置为 True 时应用) :

FieldInfo fi = typeof(Form).GetField("closeReason", BindingFlags.Instance | BindingFlags.NonPublic);

fi.SetValue(this, CloseReason.None);
于 2010-04-02T05:09:06.313 回答
0

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

于 2010-04-02T05:19:12.013 回答
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

于 2011-12-28T22:34:32.260 回答