检查C#WinForm是否已关闭

本文关键字:是否 C#WinForm 检查 | 更新日期: 2023-09-27 18:25:20

我在C#Windows窗体上使用FormClosing事件,要求用户在退出前进行确认。我只希望在用户使用表单窗口角落的红十字明确关闭表单时显示此消息。当我手动关闭或隐藏表单时,我不希望显示确认消息(例如手动调用form.close())。

是否可以检查用户是否按下了红十字?

谢谢。

检查C#WinForm是否已关闭

检查FormClosingEventArgs.CloseReason属性。

如果用程序调用this.Close()或让用户单击X,则会得到两者的CloseReason.UserClosing,因此这不是有效的检查。

请参阅下面的代码以获得一个"hacky"解决方案,该解决方案基本上会调用它。如果向OnClosing传递了null参数,则关闭。

private void button1_Click(object sender, EventArgs e)
{
    OnClosing(null);
}
protected override void OnClosing(CancelEventArgs e)
{
    if (e == null)
    {
        // Raise your Message or Cancel
        this.Close();
    }
    else
    {
        base.OnClosing(e);
    }
}

您可以检查传递给FormClosing事件的事件参数的CloseReason属性。

使用FormClosing事件处理程序并放入以下简单代码:

        if (MessageBox.Show(this, "Do you want to close the Application?", "Exit App", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.No)
        {
            e.Cancel = true;
        }
        else
        {
            //close app code
        }

开箱即用,没有一种简单的方法可以检测这种行为。虽然有一个"FormClosingEventArgs.CloseReason"属性可以在FormClosing事件上检查,但它不会真正具体说明关闭的原因。

在MSDN中,"UserClosing"枚举值的描述为:

用户正在通过用户界面(UI)关闭表单例如,单击窗体窗口上的"关闭"按钮,选择从窗口的控制菜单中关闭,或按ALT+F4。

正如你所看到的,这里列出了很多原因,但没有一个具体的原因。

我认为最好的做法是移除窗口边框(包括按钮),并在其上放置自己的关闭按钮,然后捕捉其点击事件以获得您想要的行为。我以前见过它,它确实有效,尽管它看起来可能不如普通的窗口按钮"好看"。