首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

C# WinForm 關閉窗體程序未退出:FormClosing 事件與 Application.Exit() 正確用法

     編輯:程式設計疑難解答

C# WinForm 新手常遇到:點擊窗體右上角 × 關閉登錄窗,進入主窗體後再關閉主窗,程序進程仍殘留在調試狀態。根因是隱藏而非關閉登錄窗,且主窗關閉未終止消息泵。

問題代碼分析


// 登錄窗體按鈕點擊
private void button1_Click(object sender, EventArgs e) {
    if (textBox1.Text == "admin" && textBox2.Text == "123") {
        this.Hide();           // ❌ 僅隱藏,窗體實例仍存活,消息泵仍運行
        MainFir mf = new MainFir();
        mf.Show();             // 非模態顯示主窗
    }
}

// 主窗體關閉時,程序不退出,因為登錄窗體仍在運行

核心修復方案

方案一:登錄成功後關閉登錄窗,以主窗為主窗體 (推薦)


// Program.cs 入口點修改
static class Program {
    [STAThread]
    static void Main() {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        
        // 1. 先顯示登錄對話框 (模態)
        using (LoginForm login = new LoginForm()) {
            if (login.ShowDialog() == DialogResult.OK) {
                // 2. 登錄成功,運行主窗體
                Application.Run(new MainFir());
            }
        }
        // 3. 登錄取消/失敗,程序自然退出
    }
}

// LoginForm.cs
private void button1_Click(object sender, EventArgs e) {
    if (textBox1.Text == "admin" && textBox2.Text == "123") {
        this.DialogResult = DialogResult.OK; // 設置結果並關閉模態對話框
        // this.Close(); // 隱含調用
    } else {
        MessageBox.Show("用戶名或密碼錯誤");
    }
}

方案二:保持原結構,主窗關閉時強制退出


// MainFir.cs 主窗體
protected override void OnFormClosing(FormClosingEventArgs e) {
    base.OnFormClosing(e);
    // 關鍵:強制終止所有消息泵,退出進程
    Application.Exit(); 
}

// 或在 FormClosing 事件處理器 (設計器雙擊 FormClosing 事件)
private void MainFir_FormClosing(object sender, FormClosingEventArgs e) {
    Application.Exit();
}

方案三:登錄窗改為模態顯示主窗


// 登錄窗體
private void button1_Click(object sender, EventArgs e) {
    if (textBox1.Text == "admin" && textBox2.Text == "123") {
        this.Hide();
        MainFir mf = new MainFir();
        mf.ShowDialog(this); // 模態顯示,主窗關閉後返回此處
        this.Close();        // 關閉登錄窗,程序退出
    }
}

FormClosing vs FormClosed 事件區別

事件觸發時機可取消關閉典型用途
FormClosing關閉開始前✅ e.Cancel = true確認保存、驗證權限、清理資源
FormClosed關閉完成後❌釋放非托管資源、記錄日誌

在設計器中添加 FormClosing 事件

  1. 選中窗體設計器
  2. 屬性面板 (F4) → 黃色閃電圖標 (事件)
  3. 找到 FormClosing → 雙擊或輸入方法名
  4. 自動生成處理器:private void Form1_FormClosing(object sender, FormClosingEventArgs e)

最佳實踐總結

  1. 入口點用 Application.Run(mainForm),僅一個主窗體控制進程生命週期
  2. 登錄/啟動頁用 ShowDialog() 模態顯示,返回 DialogResult 決定是否啟動主窗
  3. 主窗關閉調用 Application.Exit() 確保所有消息泵終止
  4. 避免 Hide() 代替 Close() 作為窗體切換手段

規範窗體生命週期管理,是 WinForm 開發穩定性的基石。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved