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

C++Builder 系統托盤程式開發:Shell_NotifyIcon 完整指南

     編輯:VC 教學

什麼是系統托盤?

任務列右側通知區域。應用程式放置圖示提供狀態指示、快速存取選單、雙擊還原主視窗等功能。核心 API:**Shell_NotifyIcon**。

NOTIFYICONDATA 結構體關鍵欄位

欄位用途
cbSize結構大小,必須初始化 sizeof(NOTIFYICONDATA)
hWnd接收回呼訊息的視窗控制代碼
uID應用定義的圖示 ID(同一視窗可多圖示)
uFlags指定後續欄位有效性:NIF_MESSAGE|NIF_ICON|NIF_TIP|NIF_STATE|NIF_INFO (Win2K+)
uCallbackMessage自訂訊息值(如 WM_APP+100),滑鼠事件將以此訊息傳遞給 hWnd
hIcon托盤顯示的圖示控制代碼
szTip[128]滑鼠懸停工具提示文字
dwState/dwStateMask圖示狀態(隱藏/共用圖示等)
szInfo[256]/uTimeout/szInfoTitle[64]氣球提示內容/時間/標題 (Win2K+)

三大核心操作


// 1. 新增圖示
bool AddTrayIcon(HWND hwnd, UINT id, HICON hIcon, UINT msg, LPCTSTR tip) {
    NOTIFYICONDATA nid = { sizeof(nid) };
    nid.hWnd = hwnd; nid.uID = id; nid.uFlags = NIF_MESSAGE|NIF_ICON|NIF_TIP;
    nid.uCallbackMessage = msg; nid.hIcon = hIcon;
    lstrcpyn(nid.szTip, tip, 128);
    return Shell_NotifyIcon(NIM_ADD, &nid);
}

// 2. 修改圖示/提示
bool ModifyTrayIcon(HWND hwnd, UINT id, HICON hIcon, LPCTSTR tip) {
    NOTIFYICONDATA nid = { sizeof(nid) };
    nid.hWnd = hwnd; nid.uID = id; nid.uFlags = NIF_ICON|NIF_TIP;
    nid.hIcon = hIcon; lstrcpyn(nid.szTip, tip, 128);
    return Shell_NotifyIcon(NIM_MODIFY, &nid);
}

// 3. 移除圖示
bool RemoveTrayIcon(HWND hwnd, UINT id) {
    NOTIFYICONDATA nid = { sizeof(nid) };
    nid.hWnd = hwnd; nid.uID = id;
    return Shell_NotifyIcon(NIM_DELETE, &nid);
}

處理滑鼠事件:自訂訊息回呼


// 表單頭檔宣告
#define WM_TRAYICON (WM_APP + 100)
BEGIN_MESSAGE_MAP
    VCL_MESSAGE_HANDLER(WM_TRAYICON, TMessage, OnTrayIcon)
END_MESSAGE_MAP(TForm)

// 處理函式
void __fastcall TForm1::OnTrayIcon(TMessage& Msg) {
    switch (Msg.LParam) {
        case WM_LBUTTONDBLCLK:  // 雙擊左鍵
            ShowWindow(Handle, SW_SHOW);
            Application->Restore();
            break;
        case WM_RBUTTONUP: {    // 右鍵彈出選單
            POINT pt; GetCursorPos(&pt);
            SetForegroundWindow(Handle);  // 修正選單焦點問題
            PopupMenu1->Popup(pt.x, pt.y);
            break;
        }
    }
}

C++Builder 專用簡化:TrayIcon 元件

元件面板 **Additional** 頁面有 TTrayIcon,屬性設定:

  • Icons:圖示集合(動畫支援)。
  • Hint:工具提示。
  • Animate/AnimateInterval:動畫控制。
  • OnClick/OnDblClick/OnMouseDown:事件直接處理。
  • PopupMenu:關聯右鍵選單。

**推薦新專案直接使用 TTrayIcon**,封裝了 Shell_NotifyIcon 細節、自動處理視窗建立/銷毀時機、支援設計時預覽。

常見坑與解決

總結

系統托盤開發核心是 **NOTIFYICONDATA 正確初始化 + Shell_NotifyIcon 三大操作 + 自訂訊息處理滑鼠事件**。C++Builder 開發者**強烈建議使用 TTrayIcon 元件**,專注業務邏輯而非 API 細節。記住處理 WM_TASKBARCREATED 確保 Explorer 重啟後圖示自動恢復。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
問題原因解決
圖示不顯示hIcon 為 NULL、uFlags 缺 NIF_ICON、cbSize 未設檢查結構體初始化、圖示資源載入成功
右鍵選單彈出後不消失/失焦前景視窗未設定SetForegroundWindow(Handle) 在 Popup 前呼叫
氣球提示不顯示系統設定關閉通知、uTimeout 過短、WinXP 需啟用檢查系統通知設定、uTimeout 設 10000-30000ms
多顯示器任務列圖示重複/丟失Explorer 重啟導致托盤區重建處理 WM_TASKBARCREATED 訊息重新 NIM_ADD