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

WinAPI 鉤子回調函數參考:CBTProc (WH_CBT)

     編輯:Delphi

CBTProc 是 WH_CBT (Computer-Based Training) 鉤子類型的回調函數,用於攔截視窗管理關鍵操作:建立、啟動、銷毀、最大化/最小化、移動、尺寸變更、系統命令執行前、訊息隊列鼠標/鍵盤訊息移除前、系統訊息同步前等。

函數原型

function CBTProc(
  nCode: Integer;      // 通知代碼 (見下表)
  wParam: WPARAM;      // 依 nCode 而異
  lParam: LPARAM       // 依 nCode 而異
): LRESULT; stdcall;

nCode 常見值對照表

常數值觸發時機wParamlParam
HCBT_CREATEWND3視窗建立前 (CreateWindowEx 之後、WM_CREATE 之前)新視窗 HWNDPCBT_CREATEWND (含 CREATESTRUCT 指標)
HCBT_DESTROYWND4視窗銷毀前視窗 HWND0
HCBT_ACTIVATE5視窗即將啟動新啟動視窗 HWND前一啟動視窗 HWND
HCBT_CLICKSKIPPED6滑鼠點擊非客戶區被跳過擊測代碼PMOUSEHOOKSTRUCT
HCBT_KEYSKIPPED7鍵盤訊息被跳過虛擬鍵碼鍵盤訊息 lParam
HCBT_SYSCOMMAND8系統命令執行前 (WM_SYSCOMMAND)命令類型 (SC_CLOSE, SC_MAXIMIZE...)0
HCBT_SETFOCUS9焦點即將設定獲得焦點視窗 HWND失去焦點視窗 HWND
HCBT_MOVESIZE0視窗即將移動/縮放視窗 HWNDPRECT (新位置/尺寸)
HCBT_MINMAX1視窗即將最大化/最小化視窗 HWNDPMINMAXINFO
HCBT_QS2訊息隊列狀態變化00

返回值語意

  • 0:允許操作繼續 (放行)。
  • 非 0:阻止操作 (攔截)。例如返回 TRUE 阻止視窗建立、啟動、最大化等。

典型應用場景

  1. 視窗攔截/修改:在 HCBT_CREATEWND 中修改 CREATESTRUCT 改變視窗樣式、位置、父視窗。
  2. 強制關閉/阻擋:在 HCBT_SYSCOMMAND 攔截 SC_CLOSE 實現防關閉;攔截 HCBT_ACTIVATE 實現視窗鎖定。
  3. 視窗管理工具:記錄所有視窗建立/銷毀生命週期,實現任務管理器、視窗檢視器。
  4. 無障礙/自動化:攔截焦點切換、系統命令輔助測試腳本。

關鍵結構體

type
  TCBTCreateWnd = record
    lpcs: PCREATESTRUCT;  // CREATESTRUCT 指標
    hwndInsertAfter: HWND; // Z-order 插入位置
  end;
  PCBTCreateWnd = ^TCBTCreateWnd;

安裝範例 (線程級)

var
  hCBTHook: HHOOK;

function MyCBTProc(nCode: Integer; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall;
begin
  if nCode = HCBT_CREATEWND then
  begin
    // 可在此修改 PCBTCreateWnd(lParam)^.lpcs^ 內容
  end;
  Result := CallNextHookEx(hCBTHook, nCode, wParam, lParam);
end;

hCBTHook := SetWindowsHookEx(WH_CBT, @MyCBTProc, HInstance, GetCurrentThreadId);

注意事項

  • WH_CBT 為**系統級或線程級**,全域安裝需 DLL。
  • 回調執行於**目標線程上下文**,可安全存取該線程 VCL (需同步)。
  • 阻止視窗建立 (HCBT_CREATEWND 返回非 0) 會導致 CreateWindowEx 失敗返回 0,調用方需處理。
  • 效能敏感:視窗建立/銷毀高頻時回調不宜耗時。

CBTProc 是開發視窗管理、自動化測試、無障礙工具、防外掛保護的核心介面,掌握其通知代碼與參數結構至關重要。

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