經典案例:即時通訊軟體、下載工具、監控程式。使用者點擊右上角 ×,程式隱藏至通知區,雙擊圖示還原。
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); // 其他訊息交給基類處理
}
NotifyIcon 元件,設定 Icon、Text、ContextMenuStrip(右鍵選單)。ShowInTaskbar = false(可選,視需求)。WndProc 如上。NotifyIcon.DoubleClick 或選單「還原」項目中:
this.Show();
this.WindowState = FormWindowState.Normal;
notifyIcon.Visible = false;
Application.Exit()。
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,否則圖示殘留。NotifyIcon 圖示建議提供多尺寸 .ico 或使用向量圖示。WndProc 需 UI 執行緒,單測需模擬訊息泵。攔截關閉訊息實現「最小化到匣」是 WinForms 經典技巧。現代開發推薦使用 FormClosing 事件,程式碼更清晰、維護性更佳。搭配 NotifyIcon 與右鍵選單,即可打造專業級背景常駐應用體驗。