GetMsgProc 配合 WH_GETMESSAGE 鉤子類型,用於攔截線程呼叫 GetMessage 或 PeekMessage 從訊息佇列取出訊息的瞬間。此鉤子可在訊息分派給視窗程序之前檢查、修改、甚至移除訊息。
function GetMsgProc(
nCode: Integer; // 鉤子代碼
wParam: WPARAM; // 訊息處理標誌
lParam: LPARAM // 指向 MSG 結構
): LRESULT; stdcall;
HC_ACTION (0):正常處理,lParam 指向有效 MSGHC_NOREMOVE (3):PeekMessage(..., PM_NOREMOVE) 取得訊息但未移除,lParam 同樣指向 MSG,不可修改 訊息內容CallNextHookEx 直接傳遞MSG 結構:
type
tagMSG = record
hwnd: HWND; // 目標視窗
message: UINT; // 訊息 ID (WM_*)
wParam: WPARAM; // 參數 1
lParam: LPARAM; // 參數 2
time: DWORD; // 訊息時間戳
pt: TPoint; // 滑鼠座標 (螢幕座標)
end;
WM_HOTKEY 在視窗程序前處理WM_RBUTTONDOWN 映射為 WM_LBUTTONDOWN 實現左右鍵互換| 屬性 | 系統級 (dwThreadId=0) | 線程級 (dwThreadId>0) |
|---|---|---|
| 回調位置 | 必須在 DLL | 可在 EXE |
| 影響範圍 | 所有 GUI 線程 | 指定線程 |
| 效能影響 | 大 (每條訊息皆經過) | 小 |
| 典型用途 | 全域熱鍵、輸入法、螢幕閱讀器 | 單模組訊息監控 |
GetMessage、PeekMessage、SendMessage、DialogBox 等進入訊息迴路的函數,會導致遞歸死結。HC_ACTION 且確定安全時修改 message、wParam、lParam;hwnd 修改可能導致訊息送達錯誤視窗。CallNextHookEx 結果;若吞噬訊息返回非零 (如 1)。SetWindowsHookEx(WH_GETMESSAGE, ...) 仍是全域訊息攔截唯一標準方式Application.OnMessage (VCL) 或 TApplicationEvents.OnMessage 事件,無需鉤子,效能更好、更安全WH_KEYBOARD_LL/WH_MOUSE_LL (不需 DLL)