提示: 如果要設置系統級鉤子, 鉤子函數必須在 DLL 中.
SetWindowsHookEx(
idHook: Integer; {鉤子類型}
lpfn: TFNHookProc; {函數指針}
hmod: HINST; {包含鉤子函數的模塊(EXE、DLL)句柄; 一般是 HInstance; 如果是當前線程這裡可以是 0}
dwThreadId: DWORD {關聯的線程; 可用 GetCurrentThreadId 獲取當前線程; 0 表示是系統級鉤子}
): HHOOK; {返回鉤子的句柄; 0 表示失敗}
//鉤子類型 idHook 選項:
WH_MSGFILTER = -1; {線程級; 截獲用戶與控件交互的消息}
WH_JOURNALRECORD = 0; {系統級; 記錄所有消息隊列從消息隊列送出的輸入消息, 在消息從隊列中清除時發生; 可用於宏記錄}
WH_JOURNALPLAYBACK = 1; {系統級; 回放由 WH_JOURNALRECORD 記錄的消息, 也就是將這些消息重新送入消息隊列}
WH_KEYBOARD = 2; {系統級或線程級; 截獲鍵盤消息}
WH_GETMESSAGE = 3; {系統級或線程級; 截獲從消息隊列送出的消息}
WH_CALLWNDPROC = 4; {系統級或線程級; 截獲發送到目標窗口的消息, 在 SendMessage 調用時發生}
WH_CBT = 5; {系統級或線程級; 截獲系統基本消息, 譬如: 窗口的創建、激活、關閉、最大最小化、移動等等}
WH_SYSMSGFILTER = 6; {系統級; 截獲系統范圍內用戶與控件交互的消息}
WH_MOUSE = 7; {系統級或線程級; 截獲鼠標消息}
WH_HARDWARE = 8; {系統級或線程級; 截獲非標准硬件(非鼠標、鍵盤)的消息}
WH_DEBUG = 9; {系統級或線程級; 在其他鉤子調用前調用, 用於調試鉤子}
WH_SHELL = 10; {系統級或線程級; 截獲發向外殼應用程序的消息}
WH_FOREGROUNDIDLE = 11; {系統級或線程級; 在程序前台線程空閒時調用}
WH_CALLWNDPROCRET = 12; {系統級或線程級; 截獲目標窗口處理完畢的消息, 在 SendMessage 調用後發生}