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

Delphi 建立系統匣應用程式 (Tray Icon) 純 API 實作

     編輯:Delphi

概念

系統匣 (Taskbar Notification Area) 圖示不需 VCL TApplication 主視窗,僅需一個隱藏視窗處理回呼訊息 (WM_USER+1000),配合 Shell_NotifyIcon API 即可實現極小體積 (約 20KB) 的常駐程式。

核心流程

  1. RegisterClass 登記視窗類別,CreateWindow 建立隱藏視窗 (WS_OVERLAPPEDWINDOW + SW_HIDE)。
  2. Shell_NotifyIcon(NIM_ADD, ...) 註冊圖示、工具提示、回呼訊息號。
  3. 標準訊息迴圈 GetMessage/TranslateMessage/DispatchMessage。
  4. 視窗程序處理 WM_DESTROY (退出)、WM_COMMAND (選單項目)、自訂回呼 WM_MYCALLBACK (滑鼠左/右鍵點擊圖示)。
  5. 右鍵彈出選單:列舉桌面捷徑 (SHGetDesktopFolder/IEnumIDList) 動態建立,另加「離開」項目。
  6. 選中項目以 ShellExecute 執行。
  7. 結束時 Shell_NotifyIcon(NIM_DELETE) 移除圖示。

關鍵程式碼片段


const WM_MYCALLBACK = WM_USER + 1000;
      CM_EXIT = 100; CM_ABOUT = 101;

var MainWindow: HWND; IconData: array[1..100] of String;

function WndProc(Wnd: HWND; Msg, wParam, lParam: Integer): Integer; stdcall;
begin
  Result := 0;
  case Msg of
    WM_NCCREATE: Result := 1;
    WM_DESTROY: PostQuitMessage(0);
    WM_COMMAND:
      if wParam = CM_EXIT then PostMessage(Wnd, WM_DESTROY, 0, 0)
      else if wParam = CM_ABOUT then MessageBox(0, 'About...', 'Tray', MB_OK)
      else OpenDesktopIcon(wParam - CM_ABOUT);
    WM_MYCALLBACK:
      if lParam = WM_LBUTTONDOWN then ShowIconPopupMenu
      else if lParam = WM_RBUTTONDOWN then ShowAboutPopupMenu;
    else Result := DefWindowProc(Wnd, Msg, wParam, lParam);
  end;
end;

procedure AddTrayIcon;
var NID: TNotifyIconData;
begin
  FillChar(NID, SizeOf(NID), 0);
  NID.cbSize := SizeOf(NID);
  NID.Wnd := MainWindow;
  NID.uID := 0;
  NID.uFlags := NIF_ICON or NIF_MESSAGE or NIF_TIP;
  NID.uCallbackMessage := WM_MYCALLBACK;
  NID.hIcon := LoadIcon(HInstance, 'MYICON');
  StrCopy(NID.szTip, 'My Tray App');
  Shell_NotifyIcon(NIM_ADD, @NID);
end;

優缺點

  • 優點:無 VCL 開銷,EXE 極小 (約 20KB),啟動極快。
  • 缺點:純 API 寫法繁瑣,無視覺化設計支援,維護難度較高。
  • 替代方案:使用 TTrayIcon (Delphi 2009+) 或第三方元件 (如 TrayIcon 元件),開發效率高但體積較大。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved