You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在特定窗体关闭时关闭Windows应用程序(Program.cs非启动页)

解决特定窗体关闭时退出整个应用的问题

看起来你遇到的问题是,当关闭某个特定窗体时,希望整个应用程序一起退出,但之前写的代码没起作用,而且还没法修改非启动页的Program.cs。别担心,这里有几个可行的方案:

方案一:遍历并关闭所有打开的窗体,再退出应用

最稳妥的方式是在目标窗体的FormClosing事件中,先关闭所有其他打开的窗体,再调用应用退出方法。这样能确保没有残留的窗体或线程让应用继续运行。

代码示例:

private void TargetForm_FormClosing(object sender, FormClosingEventArgs e)
{
    // 倒序遍历打开的窗体(避免遍历过程中集合变化引发异常)
    for (int i = Application.OpenForms.Count - 1; i >= 0; i--)
    {
        var openForm = Application.OpenForms[i];
        // 跳过当前正在关闭的窗体
        if (openForm != this)
        {
            openForm.Close();
        }
    }

    // 触发应用退出
    Application.Exit();

    // 如果Application.Exit()没生效(比如有后台线程还在运行),可以用更强制的方式:
    // Environment.Exit(0);
}

为什么这个方法有效?

很多时候之前的代码失效,是因为只关闭了当前窗体,但应用中还有其他打开的窗体(比如启动页窗体)在后台运行,导致应用进程没有终止。这个方法会把所有窗体都关闭,再强制应用退出。

方案二:直接终止当前进程(更粗暴但有效)

如果上面的方法还是不行,可以直接终止当前应用的进程,这种方式会立刻结束所有相关线程和窗体:

private void TargetForm_FormClosing(object sender, FormClosingEventArgs e)
{
    System.Diagnostics.Process.GetCurrentProcess().Kill();
}

⚠️ 注意:这个方法比较粗暴,不会触发窗体的FormClosingFormClosed事件,也不会让应用有机会保存数据,所以只在其他方法都失效时使用。

额外注意事项

  • 如果你的应用有后台线程在运行,Application.Exit()可能不会立刻退出,因为后台线程会阻止应用关闭。这种情况下,你需要先优雅地终止后台线程(比如设置取消令牌),再调用退出方法。
  • 确保你已经正确绑定了FormClosing事件到目标窗体的代码上(可以在设计器里双击FormClosing事件,或者手动在构造函数里添加this.FormClosing += TargetForm_FormClosing;)。

内容的提问来源于stack exchange,提问作者the pro-gramer

火山引擎 最新活动