長期運行的後台程序(下載工具、監控服務、音樂播放器)需常駐系統托盤,不佔用任務欄空間,右鍵菜單提供快速操作入口。
notifyIcon1)contextMenuStrip1)notifyIcon1 關鍵屬性:
Icon:選擇 .ico 圖標文件(建議 16x16/32x32 多尺寸)ContextMenuStrip:關聯 contextMenuStrip1Text:懸停提示文本(如 "網絡電視播放器")Visible:默認 falseShowInTaskbar = false(不在任務欄顯示)WindowState = FormWindowState.Minimized(啟動即最小化)在 contextMenuStrip1 中添加菜單項並綁定事件:
// 設計器自動生成或手動添加
private void InitializeContextMenu()
{
contextMenuStrip1.Items.AddRange(new ToolStripItem[] {
new ToolStripMenuItem("打開主界面", null, MenuOpen_Click),
new ToolStripMenuItem("設置", null, MenuSettings_Click),
new ToolStripSeparator(),
new ToolStripMenuItem("退出程序", null, MenuExit_Click)
});
}
private void MenuOpen_Click(object sender, EventArgs e) => ShowMainForm();
private void MenuSettings_Click(object sender, EventArgs e) => new SettingsForm().ShowDialog();
private void MenuExit_Click(object sender, EventArgs e) => Application.Exit();
public partial class MainForm : Form
{
public MainForm()
{
InitializeComponent();
// 訂閱 SizeChanged 事件
this.SizeChanged += MainForm_SizeChanged;
// 雙擊托盤圖標還原窗體
notifyIcon1.DoubleClick += (s, e) => ShowMainForm();
}
private void MainForm_SizeChanged(object sender, EventArgs e)
{
if (this.WindowState == FormWindowState.Minimized)
{
this.Hide(); // 隱藏窗體
notifyIcon1.Visible = true; // 顯示托盤圖標
notifyIcon1.ShowBalloonTip(1000, "提示", "程序已最小化到托盤", ToolTipIcon.Info);
}
}
private void ShowMainForm()
{
this.Show();
this.WindowState = FormWindowState.Normal;
this.Activate(); // 激活窗體獲取焦點
notifyIcon1.Visible = false; // 隱藏托盤圖標
}
// 關閉按鈕改為最小化到托盤
protected override void OnFormClosing(FormClosingEventArgs e)
{
if (e.CloseReason == CloseReason.UserClosing)
{
e.Cancel = true; // 取消關閉
this.WindowState = FormWindowState.Minimized; // 轉為最小化
}
base.OnFormClosing(e);
}
}
// 後台任務完成通知
public void NotifyDownloadComplete(string fileName)
{
if (this.WindowState == FormWindowState.Minimized)
{
notifyIcon1.ShowBalloonTip(3000, "下載完成",
$"{fileName} 已下載完成", ToolTipIcon.Info);
}
else
{
MessageBox.Show($"{fileName} 已下載完成", "提示");
}
}
// 托盤圖標動態更新(如顯示下載進度)
public void UpdateTrayIcon(string text, Icon icon = null)
{
notifyIcon1.Text = text;
if (icon != null) notifyIcon1.Icon = icon;
}
| 問題 | 原因 | 解決方案 |
|---|---|---|
| 托盤圖標不顯示 | Icon 屬性未設置或文件路徑錯誤 | 使用項目資源文件嵌入 .ico,或絕對路徑加載 |
| 右鍵菜單不彈出 | ContextMenuStrip 未關聯 | 設置 notifyIcon1.ContextMenuStrip = contextMenuStrip1 |
| 雙擊無反應 | 未綁定 DoubleClick 事件 | 添加 notifyIcon1.DoubleClick += ... 處理還原邏輯 |
| 關閉程序無法退出 | OnFormClosing 取消了關閉 | 菜單「退出」調用 Application.Exit() 強制退出 |
| 多實例運行 | 未檢測現有進程 | Program.cs 中使用 Mutex 單例模式 |
static class Program
{
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
// 全局互斥體防止多開
using (Mutex mutex = new Mutex(true, "MyTrayAppUniqueName", out bool createdNew))
{
if (createdNew)
{
Application.Run(new MainForm());
}
else
{
// 可選:激活已有實例
MessageBox.Show("程序已在運行中", "提示");
}
}
}
}
通過 NotifyIcon + ContextMenuStrip + SizeChanged 事件的組合,僅需 30 行核心代碼即可實現專業級托盤應用。關鍵點在於:
此模式廣泛應用於網絡電視播放器、下載管理器、系統監控工具等長期運行的桌面應用中。