首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C# WinForms 攔截視窗關閉訊息,實現最小化到系統匣

     編輯:關於C語言

需求:點擊關閉鈕不結束程式,而是縮到系統匣

經典案例:即時通訊軟體、下載工具、監控程式。使用者點擊右上角 ×,程式隱藏至通知區,雙擊圖示還原。

核心技術:覆寫 WndProc 攔截 WM_SYSCOMMAND


protected override void WndProc(ref Message m)
{
    const int WM_SYSCOMMAND = 0x0112;
    const int SC_CLOSE = 0xF060;

    if (m.Msg == WM_SYSCOMMAND && (int)m.WParam == SC_CLOSE)
    {
        // 取消關閉行為
        // 隱藏視窗、顯示 NotifyIcon
        this.Hide();
        notifyIcon.Visible = true;
        return; // 重要:不呼叫 base.WndProc,避免預設關閉流程
    }

    base.WndProc(ref m); // 其他訊息交給基類處理
}

完整實作步驟

  1. 工具箱拖入 NotifyIcon 元件,設定 Icon、Text、ContextMenuStrip(右鍵選單)。
  2. Form 屬性:ShowInTaskbar = false(可選,視需求)。
  3. 覆寫 WndProc 如上。
  4. 在 NotifyIcon.DoubleClick 或選單「還原」項目中:
    
    this.Show();
    this.WindowState = FormWindowState.Normal;
    notifyIcon.Visible = false;
    
  5. 真正結束程式:在選單提供「結束」項目,呼叫 Application.Exit()。

替代方案:FormClosing 事件


private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
    if (e.CloseReason == CloseReason.UserClosing)
    {
        e.Cancel = true; // 取消關閉
        this.Hide();
        notifyIcon.Visible = true;
    }
}

差異:FormClosing 更高層、語意清晰、支援所有關閉原因(工作管理員結束進程除外)。WndProc 攔截更底層,可攔截非標準關閉訊息。推薦優先使用 FormClosing。

注意事項

  • 應用程式結束時:確保 notifyIcon.Dispose() 或 Visible = false,否則圖示殘留。
  • 多執行個體:啟動時檢查是否已有執行個體(Mutex),避免多個匣圖示。
  • 高 DPI:NotifyIcon 圖示建議提供多尺寸 .ico 或使用向量圖示。
  • 單元測試:WndProc 需 UI 執行緒,單測需模擬訊息泵。

結語

攔截關閉訊息實現「最小化到匣」是 WinForms 經典技巧。現代開發推薦使用 FormClosing 事件,程式碼更清晰、維護性更佳。搭配 NotifyIcon 與右鍵選單,即可打造專業級背景常駐應用體驗。

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