You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

WinForms程序关闭后仍驻留进程,红叉未触发FormClosed事件求助

问题分析与解决

环境

  • Visual Studio 2022
  • .NET 7
  • C# WinForms项目模板

问题描述

使用Start Without Debug启动程序,点击窗口右上角红叉时未触发FormClosed事件,想了解红叉触发的是哪个事件,以及为何程序关闭后仍在进程中存活。

相关代码

Program类代码

namespace JKEventsPractice1123
{
    internal static class Program
    {
        static Button _button1 = new Button();

        /// <summary>
        ///  The main entry point for the application.
        /// </summary>
        [STAThread]
        static void Main()
        {
            ApplicationConfiguration.Initialize();

            _button1 = new Button();
            _button1.Click += Button1_Clicked;

            var form = new Form();
            form.Controls.Add(_button1);
            form.Show();
            Application.Run();
        }

        static void Button1_Clicked(object sender, EventArgs e)
        {
            MessageBox.Show("You clicked the button");
            _button1.Click -= Button1_Clicked;
        }
    }
}

Form1后台代码

private void Form1_FormClosed(object sender, FormClosedEventArgs e)
{
    Application.Exit();
}

问题原因与解答

1. 为何FormClosed事件未触发?

你在Program.Main里实例化的是通用Form类,而非项目中的Form1类。Form1里的FormClosed事件处理方法只绑定在Form1的实例上,和你实际显示的那个Form实例完全无关,自然不会被触发。

2. 点击红叉触发的是什么事件?

点击窗口红叉时,会依次触发当前Form实例的FormClosing和FormClosed事件——只是你没有给这个动态创建的Form绑定任何事件处理方法,所以看不到效果。

3. 程序关闭后进程仍存活的原因?

你调用的是无参数的Application.Run()重载,这个方法启动的消息循环会一直运行,直到显式调用Application.Exit()或Application.ExitThread()才会终止。点击窗口红叉只是关闭了当前窗口,并没有终止消息循环,所以进程会继续在后台运行。

修复方案

可以任选以下一种方式解决:

  • 方案一:使用带参数的Application.Run
    将Application.Run()改为Application.Run(form),这样当主窗口关闭时,消息循环会自动终止,进程随之退出:

    var form = new Form();
    form.Controls.Add(_button1);
    Application.Run(form); // 传入form实例
    
  • 方案二:给动态创建的Form绑定FormClosed事件
    在显示窗口前,给form绑定FormClosed事件,在事件中终止消息循环:

    var form = new Form();
    form.Controls.Add(_button1);
    form.FormClosed += (s, e) => Application.Exit(); // 绑定事件
    form.Show();
    Application.Run();
    
  • 方案三:直接实例化Form1
    如果你想使用Form1中已写好的事件处理,直接创建Form1的实例即可:

    var form = new Form1();
    form.Controls.Add(_button1);
    form.Show();
    Application.Run(form);
    

内容的提问来源于stack exchange,提问作者Rod

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 18:20:11