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

C# 實現最小化到系統托盤:NotifyIcon 組件完整應用指南

     編輯:關於C語言

功能場景

長期運行的後台程序(下載工具、監控服務、音樂播放器)需常駐系統托盤,不佔用任務欄空間,右鍵菜單提供快速操作入口。

一、組件準備與屬性配置

  1. 工具箱拖入 NotifyIcon 組件(命名為 notifyIcon1)
  2. 工具箱拖入 ContextMenuStrip 組件(命名為 contextMenuStrip1)
  3. 設置 notifyIcon1 關鍵屬性:
    • Icon:選擇 .ico 圖標文件(建議 16x16/32x32 多尺寸)
    • ContextMenuStrip:關聯 contextMenuStrip1
    • Text:懸停提示文本(如 "網絡電視播放器")
    • Visible:默認 false
  4. 設置窗體屬性:
    • ShowInTaskbar = 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 單例模式

六、單例模式啟動器 (Program.cs)

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 行核心代碼即可實現專業級托盤應用。關鍵點在於:

  1. 窗體關閉行為重定向為最小化
  2. 托盤圖標可見性與窗體狀態同步
  3. 提供多種喚醒方式(雙擊、右鍵菜單、熱鍵)
  4. 單例模式保證進程唯一性

此模式廣泛應用於網絡電視播放器、下載管理器、系統監控工具等長期運行的桌面應用中。

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