CBTProc 是 WH_CBT (Computer-Based Training) 鉤子類型的回調函數,用於攔截視窗管理關鍵操作:建立、啟動、銷毀、最大化/最小化、移動、尺寸變更、系統命令執行前、訊息隊列鼠標/鍵盤訊息移除前、系統訊息同步前等。
function CBTProc(
nCode: Integer; // 通知代碼 (見下表)
wParam: WPARAM; // 依 nCode 而異
lParam: LPARAM // 依 nCode 而異
): LRESULT; stdcall;
| 常數 | 值 | 觸發時機 | wParam | lParam |
|---|---|---|---|---|
HCBT_CREATEWND | 3 | 視窗建立前 (CreateWindowEx 之後、WM_CREATE 之前) | 新視窗 HWND | PCBT_CREATEWND (含 CREATESTRUCT 指標) |
HCBT_DESTROYWND | 4 | 視窗銷毀前 | 視窗 HWND | 0 |
HCBT_ACTIVATE | 5 | 視窗即將啟動 | 新啟動視窗 HWND | 前一啟動視窗 HWND |
HCBT_CLICKSKIPPED | 6 | 滑鼠點擊非客戶區被跳過 | 擊測代碼 | PMOUSEHOOKSTRUCT |
HCBT_KEYSKIPPED | 7 | 鍵盤訊息被跳過 | 虛擬鍵碼 | 鍵盤訊息 lParam |
HCBT_SYSCOMMAND | 8 | 系統命令執行前 (WM_SYSCOMMAND) | 命令類型 (SC_CLOSE, SC_MAXIMIZE...) | 0 |
HCBT_SETFOCUS | 9 | 焦點即將設定 | 獲得焦點視窗 HWND | 失去焦點視窗 HWND |
HCBT_MOVESIZE | 0 | 視窗即將移動/縮放 | 視窗 HWND | PRECT (新位置/尺寸) |
HCBT_MINMAX | 1 | 視窗即將最大化/最小化 | 視窗 HWND | PMINMAXINFO |
HCBT_QS | 2 | 訊息隊列狀態變化 | 0 | 0 |
TRUE 阻止視窗建立、啟動、最大化等。HCBT_CREATEWND 中修改 CREATESTRUCT 改變視窗樣式、位置、父視窗。HCBT_SYSCOMMAND 攔截 SC_CLOSE 實現防關閉;攔截 HCBT_ACTIVATE 實現視窗鎖定。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。HCBT_CREATEWND 返回非 0) 會導致 CreateWindowEx 失敗返回 0,調用方需處理。CBTProc 是開發視窗管理、自動化測試、無障礙工具、防外掛保護的核心介面,掌握其通知代碼與參數結構至關重要。