2010-04-02 73 views
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行并且表单不关闭。WinForms应用程序中第二次未检测到任务管理器关闭

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

+0

OMG,我完全能够重现这样的:如果任务管理器试图关闭形式UserClosing被取消后,任务管理器的收盘使用UserClosing作为CloseReason传递尝试,而不是像往常一样传递TaskManagerClosing。这是一个错误吗?这是预期的行为?好问题,+1! – 2010-04-02 04:59:15

回答

2

我发现回答的thread由我们自己nobugz

Windows窗体无法检测到 关闭原因从任务 经理来了。所以它自动 翻译CloseReason.None到 CloseReason.TaskManagerClosing。 问题是,一旦您试图用“X”关闭 ,则CloseReason将被设置为 到UserClosing,并且如果您取消关闭,则不会将 重设为无。 马虎。

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

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

fi.SetValue(this, CloseReason.None); 
+0

它的工作原理。大。 – Samir 2010-04-02 07:02:02

0

answer这个问题,它使用CloseReason.TaskManagerClosing赶上相同。

+0

链接中的代码检测关闭是由于按钮单击还是从窗口x按钮单击导致的。在这里使用bool属性来检测。但如何检测TaskManager关闭? – Samir 2010-04-02 06:03:31

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

相关问题