系統匣程式核心在於 Shell_NotifyIcon API 與 TNotifyIconData 記錄結構(對應 C++ NOTIFYICONDATA)。Delphi 在 ShellAPI.pas 中定義:
type
_NOTIFYICONDATAA = record
cbSize: DWORD; // 結構大小,SizeOf(TNotifyIconData)
Wnd: HWND; // 接收回呼訊息的視窗控制代碼
uID: UINT; // 圖示識別碼,多圖示時區分
uFlags: UINT; // 有效欄位標誌:NIF_ICON/NIF_MESSAGE/NIF_TIP
uCallbackMessage: UINT; // 自訂回呼訊息(如 WM_USER+1000)
hIcon: HICON; // 圖示控制代碼
szTip: array[0..63] of AnsiChar; // 滑鼠懸停提示文字
end;
TNotifyIconData = TNotifyIconDataA;
七大欄位功能詳解:
cbSize:結構體大小,API 呼叫必填Wnd:指定處理回呼訊息的視窗(通常為主視窗 Handle)uID:多圖示時的唯一識別碼uFlags:組合標誌,指定哪些欄位有效uCallbackMessage:最關鍵,滑鼠點擊圖示時發送至此訊息至 WndhIcon:顯示於系統匣的圖示szTip:工具提示文字1. 定義自訂訊息常數與全域變數:
const WM_NID = WM_USER + 1000; // 系統保留 WM_USER 以上供自訂
var NotifyIcon: TNotifyIconData;
2. 表單建立時初始化並註冊:
procedure TForm1.FormCreate(Sender: TObject);
begin
with NotifyIcon do
begin
cbSize := SizeOf(TNotifyIconData);
Wnd := Handle; // 由本視窗處理回呼
uID := 1;
uFlags := NIF_ICON or NIF_MESSAGE or NIF_TIP;
uCallbackMessage := WM_NID; // 回呼訊息
hIcon := Application.Icon.Handle; // 使用應用程式圖示
szTip := '張家惡少'; // 提示文字
end;
Shell_NotifyIcon(NIM_ADD, @NotifyIcon); // 加入系統匣
end;
3. 訊息處理函數(回呼入口):
procedure WMNID(var Msg: TMessage); message WM_NID;
begin
case Msg.LParam of
WM_LBUTTONUP: Form1.Visible := not Form1.Visible; // 左鍵切換顯示/隱藏
WM_RBUTTONUP: ShowMessage('您點擊的是右鍵'); // 右鍵彈出訊息
end;
end;
4. 表單銷毀時移除圖示:
procedure TForm1.FormDestroy(Sender: TObject);
begin
Shell_NotifyIcon(NIM_DELETE, @NotifyIcon); // 釋放系統資源
end;
在 WM_RBUTTONUP 彈出 TPopupMenu 實現右鍵選單;呼叫 Shell_NotifyIcon(NIM_MODIFY, @NotifyIcon) 可動態更新圖示與提示。專案選項中設定應用程式圖示(Application 頁面),系統匣將顯示自訂圖示。
message WM_NID,才能自動攔截回呼訊息uFlags 必須包含 NIF_MESSAGE 才能接收回呼Application.Icon.Handle、LoadIcon、ExtractIcon 等這個「庖丁解牛」式的 API 結構拆解,讓系統匣程式設計從神祕黑盒變為透明可控的工程實踐。