任務列右側通知區域。應用程式放置圖示提供狀態指示、快速存取選單、雙擊還原主視窗等功能。核心 API:**Shell_NotifyIcon**。
| 欄位 | 用途 |
|---|---|
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;
}
}
}
元件面板 **Additional** 頁面有 TTrayIcon,屬性設定:
Icons:圖示集合(動畫支援)。Hint:工具提示。Animate/AnimateInterval:動畫控制。OnClick/OnDblClick/OnMouseDown:事件直接處理。PopupMenu:關聯右鍵選單。**推薦新專案直接使用 TTrayIcon**,封裝了 Shell_NotifyIcon 細節、自動處理視窗建立/銷毀時機、支援設計時預覽。
| 問題 | 原因 | 解決 |
|---|---|---|
| 圖示不顯示 | hIcon 為 NULL、uFlags 缺 NIF_ICON、cbSize 未設 | 檢查結構體初始化、圖示資源載入成功 |
| 右鍵選單彈出後不消失/失焦 | 前景視窗未設定 | SetForegroundWindow(Handle) 在 Popup 前呼叫 |
| 氣球提示不顯示 | 系統設定關閉通知、uTimeout 過短、WinXP 需啟用 | 檢查系統通知設定、uTimeout 設 10000-30000ms |
| 多顯示器任務列圖示重複/丟失 | Explorer 重啟導致托盤區重建 | 處理 WM_TASKBARCREATED 訊息重新 NIM_ADD |