在WinForms应用程序中第二次未检测到任务管理器关闭

时间:2010-04-02 04:47:01

标签: c# winforms detect taskmanager application-close

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

3 个答案:

答案 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