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。取消=true执行和形式不是封闭的。

现在事情是,在此之后,如果我闭上应用程序任务经理关闭的原因是UserClosing!!!为什么?它不应该被TaskManagerClosing?

有帮助吗?

解决方案

我发现了一个线程一个答案通过我们自己的 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);

其他提示

看看 答案 这个问题,它使用 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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top