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

Delphi 系統匣程式設計實戰:從 API 結構解析到完整範例

     編輯:Delphi

TNotifyIconData 結構深度解析

系統匣程式核心在於 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:最關鍵,滑鼠點擊圖示時發送至此訊息至 Wnd
  • hIcon:顯示於系統匣的圖示
  • 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 才能接收回呼
  • 程式結束時必須呼叫 NIM_DELETE,否則殘留圖示佔用資源,需重啟 explorer.exe 清除
  • 圖示控制代碼來源:Application.Icon.Handle、LoadIcon、ExtractIcon 等

這個「庖丁解牛」式的 API 結構拆解,讓系統匣程式設計從神祕黑盒變為透明可控的工程實踐。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved