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

C# WinForm登录后程序终止:打开Home窗体后自动关闭问题

问题原因

你的Login窗体是应用的启动窗体,WinForms默认规则是:启动窗体关闭时,整个应用的消息循环会终止,所有打开的窗体都会被销毁。这就是为什么调用this.Close()后,Home窗体也跟着关闭的核心原因。

解决方案

方法一:修改启动逻辑(推荐)

通过调整Program.cs的启动代码,让Login以模态对话框形式启动,登录成功后再将Home设为主窗体运行:

  1. 更新Program.cs的Main方法:
static void Main()
{
    Application.EnableVisualStyles();
    Application.SetCompatibleTextRenderingDefault(false);

    // 以模态方式打开登录窗体
    using (Login loginForm = new Login())
    {
        if (loginForm.ShowDialog() == DialogResult.OK)
        {
            // 登录成功,启动主窗体
            Application.Run(new Home());
        }
    }
}
  1. 修改Login窗体的按钮点击事件:
private void loginbtn_Click(object sender, EventArgs e)
{
    String username = "admin";
    String password = "admin";

    String @uname = Unametxtbox.Text;
    String @pass = Passtextbox.Text;

    if (@uname.Equals(username) && @pass.Equals(password))
    {                
        MessageBox.Show("Login Successful");                
        // 设置对话框结果为OK,告知启动逻辑登录成功
        this.DialogResult = DialogResult.OK;
        this.Close();
    }
    else
    {
        MessageBox.Show("Invalid Credentials!");
    }
}

方法二:临时隐藏Login窗体(不推荐)

如果不想修改启动代码,可以将this.Close()替换为this.Hide(),让Login窗体仅隐藏而非关闭:

private void loginbtn_Click(object sender, EventArgs e)
{
    String username = "admin";
    String password = "admin";

    String @uname = Unametxtbox.Text;
    String @pass = Passtextbox.Text;

    if (@uname.Equals(username) && @pass.Equals(password))
    {                
        MessageBox.Show("Login Successful");                
        Home home = new Home();
        home.Show();
        // 隐藏登录窗体,而非关闭
        this.Hide();
    }
    else
    {
        MessageBox.Show("Invalid Credentials!");
    }
}

注意:这种方法会让Login窗体一直驻留在内存中,直到应用完全退出,资源利用率不如方法一高效。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 10:05:34