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

Sam*_*mir 5 c# taskmanager detect application-close 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;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

因此,当我想关闭应用程序时,单击关闭按钮,消息框会按其应有的方式显示,然后我选择了“否”。然后执行 e.Cancel = true 行并且表单未关闭。

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

M.A*_*nin 4

我找到了一个线程,其中有我们自己的nobugz 的答案:

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);
Run Code Online (Sandbox Code Playgroud)