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

任務列狀態區圖示程式設計:Shell_NotifyIcon 完整指南

     編輯:VC 教學

Windows 任務列右下角的通知區(系統托盤)是長期執行背景程式(如防毒軟體、下載工具、輸入法)與使用者互動的最佳位置。本文詳細說明如何使用 Shell_NotifyIcon API 實現圖示的新增、修改、刪除,以及處理滑鼠點擊、右鍵選單等回呼訊息。

核心結構:NOTIFYICONDATA

typedef struct _NOTIFYICONDATA {
    DWORD cbSize;           // 結構大小
    HWND hWnd;              // 接收回呼訊息的視窗
    UINT uID;               // 圖示識別碼(同一視窗可有多個圖示)
    UINT uFlags;            // 有效欄位旗標:NIF_MESSAGE | NIF_ICON | NIF_TIP | NIF_STATE | NIF_INFO
    UINT uCallbackMessage;  // 自訂回呼訊息(如 WM_USER+1)
    HICON hIcon;            // 圖示控制代碼
    TCHAR szTip[128];       // 滑鼠懸停提示文字
    DWORD dwState;          // 狀態旗標(NIS_HIDDEN, NIS_SHAREDICON)
    DWORD dwStateMask;      // 狀態遮罩
    TCHAR szInfo[256];      // 氣球提示內容(Win2000+)
    union { UINT uTimeout; UINT uVersion; } DUMMYUNIONNAME;
    TCHAR szInfoTitle[64];  // 氣球提示標題
    DWORD dwInfoFlags;      // 氣球提示圖示類型
} NOTIFYICONDATA, *PNOTIFYICONDATA;

新增/刪除圖示

BOOL AddTrayIcon(HWND hWnd, UINT uID, HICON hIcon, LPCTSTR lpszTip) {
    NOTIFYICONDATA nid = {0};
    nid.cbSize = sizeof(nid);
    nid.hWnd = hWnd;
    nid.uID = uID;
    nid.uFlags = NIF_MESSAGE | NIF_ICON | NIF_TIP;
    nid.uCallbackMessage = WM_MY_TRAY_NOTIFY; // 自訂訊息
    nid.hIcon = hIcon;
    lstrcpyn(nid.szTip, lpszTip, 128);
    return Shell_NotifyIcon(NIM_ADD, &nid);
}

BOOL RemoveTrayIcon(HWND hWnd, UINT uID) {
    NOTIFYICONDATA nid = {0};
    nid.cbSize = sizeof(nid);
    nid.hWnd = hWnd;
    nid.uID = uID;
    return Shell_NotifyIcon(NIM_DELETE, &nid);
}

處理回呼訊息

在視窗程序中處理自訂訊息 WM_MY_TRAY_NOTIFY:

LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) {
    if (msg == WM_MY_TRAY_NOTIFY) {
        UINT uID = (UINT)wParam;      // 圖示 ID
        UINT uMouseMsg = (UINT)lParam; // 滑鼠訊息:WM_LBUTTONDOWN, WM_RBUTTONUP 等

        if (uMouseMsg == WM_RBUTTONUP) {
            POINT pt; GetCursorPos(&pt);
            SetForegroundWindow(hWnd); // 關鍵:否則選單可能不會消失
            TrackPopupMenu(hPopupMenu, TPM_RIGHTBUTTON, pt.x, pt.y, 0, hWnd, NULL);
            PostMessage(hWnd, WM_NULL, 0, 0); // 修正選單殘留問題
        }
        else if (uMouseMsg == WM_LBUTTONDBLCLK) {
            // 雙擊開啟主視窗
            ShowWindow(hWnd, SW_RESTORE);
        }
    }
    // ...
}

進階功能:氣球提示

Win2000/XP 以上支援 NIF_INFO 旗標,設定 szInfo、szInfoTitle、dwInfoFlags(NIIF_INFO, NIIF_WARNING, NIIF_ERROR)並呼叫 Shell_NotifyIcon(NIM_MODIFY, &nid) 即可顯示氣球提示,適合背景程式通知事件(如「下載完成」、「偵測到病毒」)。

版本相容性注意

  • cbSize 決定結構版本:sizeof(NOTIFYICONDATA) 通常為 488 位元組(Vista+),若需相容 Win95/NT4,可設為 NOTIFYICONDATA_V1_SIZE (88 位元組) 或 NOTIFYICONDATA_V2_SIZE (136 位元組)。
  • 呼叫 Shell_NotifyIcon 前建議先設定 nid.uVersion = NOTIFYICON_VERSION_4(或 3)以啟用新功能。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved