需要在关闭任何子窗口之前及早检测 WinForms 应用程序何时关闭



我有一个具有多个 MDI 子窗口的 winforms C# 应用程序,每个子窗口都可以包含更改的用户数据。

单独关闭子窗口时,将警告用户有关更改的数据,这工作正常。

但是,如果用户尝试关闭应用程序,我只想对所有子窗口发出一次警告,如果有数据已更改(数据不是那么重要)。

因此,我们的想法是挂钩到主窗口的 OnClosing 事件,在任何子窗口中查找更改的用户数据,如果我发现任何更改的数据,则只显示一次警告,并设置一个布尔值以防止每个子窗口多次打扰用户。

我看到的问题是,主窗口的 OnClosed 事件是在触发每个子窗口的 OnClosing 事件后触发的,所以我无法足够快地设置我的布尔值。

是否有我可以挂接到的应用程序关闭事件比 OnClosing 更早到达,或者是否有我可以捕获的 Windows 消息?

如果 FormClosesingEventArgs.CloseReason MdiFormClosing,您可以让子表单订阅 FormClosing 事件并跳过处理,而不是挂接到 MDI 父窗体关闭消息和设置标志:

private void ChildForm_FormClosing(object sender, FormClosingEventArgs e)
{
    if (e.CloseReason == CloseReason.MdiFormClosing) return; // Do nothing
    // ...
}

解决了,我只需要挂接到WM_CLOSE Windows消息:

protected override void WndProc(ref Message m)
{
    // Crucially, this message arrives before my child windows get the OnClosing event.
    if (m.Msg == WM_CLOSE)
    {
         // So I set my boolean here and everything works great.
    }
    base.WndProc(ref m);
}

我会在每个子窗口中创建一个布尔值,指示是否打开提示。

public bool Prompt = true;
private void Form_Closing(object sender, EventArgs e)
{
    if (Prompt)
    {
        MessageBox.Show("Data thingy...whatever");
    }
}

然后在您的主窗体中,您可以将此布尔值设置为 false。

private void MainForm_Closing(object sender, EventArgs e)
{
    form1.Prompt = false;
    form1.Close();
    form2.Prompt = false;
    form2.Close();
    //etc
}

最新更新