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

时间:2016-03-17 10:49:10

标签: c# winforms

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

当单独关闭子窗口时,会向用户发出有关已更改数据的警告,这样可以正常工作。

但是,如果用户试图关闭应用程序,我只想为所有子窗口发出一次警告,如果有任何更改了数据(数据不是那么关键)。

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

我看到的问题是,在触发每个子窗口的OnClosing事件后触发主窗口的OnClosing事件,所以我不能很快设置我的布尔值。

是否存在应用程序关闭的事件,我可以挂钩,比OnClosing更快到达,或者是否有可能存在的Windows消息?

3 个答案:

答案 0 :(得分:2)

解决了它,我只需要挂钩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);
}

答案 1 :(得分:2)

如果FormClosingMdiFormClosing,您可以让您的子表单订阅FormClosingEventArgs.CloseReason事件并跳过处理,而不是挂钩到MDI父表单关闭消息和设置标记:

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

答案 2 :(得分:0)

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

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
}