需求
- 視窗最小化 → 隱藏工作列、顯示系統托盤圖示
- 點擊托盤圖示 → 還原視窗、隱藏圖示
- 托盤圖示右鍵選單支援額外功能 (如開啟、退出)
步驟總覽
- 表單屬性
ShowInTaskbar = false (最小化時不佔工作列)
- 工具箱拖入
NotifyIcon (命名 notifyIcon1),設定 Icon 屬性
- 訂閱
Form.SizeChanged 事件處理最小化邏輯
- 訂閱
NotifyIcon.Click (或 DoubleClick) 還原視窗
- 拖入
ContextMenuStrip 關聯 NotifyIcon.ContextMenuStrip
完整代碼
public partial class MainForm : Form
{
public MainForm()
{
InitializeComponent();
// 1. 表單屬性
this.ShowInTaskbar = false;
// 2. NotifyIcon 圖示已在設計器設定
// 3. ContextMenuStrip 已關聯 notifyIcon1.ContextMenuStrip
// 事件訂閱 (設計器自動產生於 InitializeComponent)
this.SizeChanged += MainForm_SizeChanged;
notifyIcon1.Click += NotifyIcon1_Click;
}
private void MainForm_SizeChanged(object sender, EventArgs e)
{
if (this.WindowState == FormWindowState.Minimized)
{
this.Hide(); // 隱藏視窗
notifyIcon1.Visible = true; // 顯示托盤圖示
}
}
private void NotifyIcon1_Click(object sender, EventArgs e)
{
this.Visible = true;
this.WindowState = FormWindowState.Normal;
notifyIcon1.Visible = false;
}
// ContextMenuStrip 項目事件範例
private void mnuOpen_Click(object sender, EventArgs e)
{
NotifyIcon1_Click(sender, e); // 復用還原邏輯
}
private void mnuExit_Click(object sender, EventArgs e)
{
notifyIcon1.Visible = false; // 隱藏圖示後再關閉
Application.Exit();
}
}
設計器自動產生的關鍵初始化 (參考)
// InitializeComponent 片段
this.notifyIcon1 = new NotifyIcon(this.components);
this.notifyIcon1.Icon = ((Icon)(resources.GetObject("notifyIcon1.Icon")));
this.notifyIcon1.Text = "我的應用程式";
this.notifyIcon1.Visible = false;
this.notifyIcon1.ContextMenuStrip = this.contextMenuStrip1;
// ContextMenuStrip
this.contextMenuStrip1.Items.AddRange(new ToolStripItem[] {
this.mnuOpen, this.mnuExit });
this.mnuOpen.Text = "開啟主視窗";
this.mnuExit.Text = "退出程式";
進階提示
- 使用
DoubleClick 而非 Click 避免單擊氣泡提示時誤觸發
NotifyIcon.BalloonTipText/Title/Icon 可顯示氣泡通知
- 應用程式結束前務必
notifyIcon1.Visible = false,否則圖示殘留托盤需重啟 explorer.exe 清除
- 若需開機自動啟動至托盤,在
Program.cs 中直接 Application.Run(new MainForm()),表單建構子設定 WindowState = FormWindowState.Minimized 並 Hide()