在 Windows 開發中,讓應用程式最小化至系統匣(System Tray)是常見需求。透過 Shell_NotifyIcon API,我們可以在通知區域顯示自訂圖示,並處理滑鼠事件。本文說明如何封裝一個可重用的函式,將視窗最小化為圖示。
系統匣圖示本質上是一個 NOTIFYICONDATA 結構體,包含視窗句柄、圖示資源、提示文字與自訂回呼訊息。當使用者點擊圖示時,系統會將自訂訊息(如 MYWM_ICON)傳送至指定視窗程序,開發者可在 switch(lParam) 中處理 WM_LBUTTONDOWN、WM_RBUTTONDOWN 等事件。
#define MYWM_ICON (WM_APP + 100)MYWM_ICON,解析 lParam 判斷滑鼠動作。WS_EX_TOOLWINDOW 或 POPUP。Shell_NotifyIcon(NIM_ADD, ...) 加入圖示,再呼叫 NIM_MODIFY 更新圖示與提示。void PutToTaskBar(HWND hWnd, UINT uId, HICON hIcon, LPCTSTR s)
{
TrayMessage(hWnd, NIM_ADD, uId, NULL, s);
TrayMessage(hWnd, NIM_MODIFY, uId, hIcon, s);
}
BOOL TrayMessage(HWND hDlg, DWORD dwMessage, UINT uID, HICON hIcon, LPCTSTR lpszTip)
{
BOOL res;
NOTIFYICONDATA tnd;
tnd.cbSize = sizeof(NOTIFYICONDATA);
tnd.hWnd = hDlg;
tnd.uID = uID;
tnd.uFlags = NIF_MESSAGE | NIF_ICON | NIF_TIP;
tnd.uCallbackMessage = MYWM_ICON;
tnd.hIcon = hIcon;
wsprintf(tnd.szTip, lpszTip);
res = Shell_NotifyIcon(dwMessage, &tnd);
if (hIcon)
DestroyIcon(hIcon);
return res;
}
注意:TrayMessage 中若傳入 hIcon,呼叫 Shell_NotifyIcon 後會銷毀該圖示控制代碼,避免資源洩漏。實際專案中建議將圖示載入為資源並妥善管理生命週期。
WM_RBUTTONUP 彈出 TrackPopupMenu。NOTIFYICONDATA 的 dwInfoFlags 與 szInfo 可顯示資訊泡泡。掌握此技巧,即可打造專業的背景常駐應用程式。