|
鉤子函數(shù)雖然不多, 但其參數(shù)復雜, 應該從參數(shù)入手才能深入進去.
UnhookWindowsHookEx 只需要 SetWindowsHookEx 返回的鉤子句柄作參數(shù), 這個簡單; 先看看 SetWindowsHookEx 的聲明: SetWindowsHookEx( 第一個參數(shù)非常麻煩, 從后面說: 參數(shù)四 dwThreadId : 在設置全局鉤子時這個參數(shù)一般是 0, 表示關聯(lián)所有線程; 本例是線程級的鉤子, 所以是 GetCurrentThreadId. 參數(shù)三 hmod: 是模塊實例的句柄, 在 EXE 和 DLL 中都可以用 HInstance 得到當前實例的句柄; 直接用 API 也可以: GetModuleHandle(nil). 參數(shù)二 lpfn: 是鉤子函數(shù)的指針, 用 @ 和 Addr 函數(shù)都可以得到函數(shù)指針; 這里的關鍵是那個鉤子函數(shù): 首先不同的鉤子類型對應著不同的鉤子函數(shù)結構, Win32 共有 14 種鉤子類型, 這是 詳細注釋; 本例用的是鍵盤鉤子, 鍵盤鉤子的回調(diào)函數(shù)的參數(shù)結構在 這里, 我們定義的函數(shù)名無所謂, 參數(shù)必須按照Windows的規(guī)定來. 還有, 這個回調(diào)函數(shù)的調(diào)用慣例必須是: stdcall; 我們在上例中是先在接口區(qū)聲明, 如果不要聲明直接實現(xiàn), 也不能忘了這個 stdcall. 根據(jù)以上說明, 做如下修改: SetWindowsHookEx 的參數(shù)有變通; 并且取消了鉤子函數(shù)在接口區(qū)的聲明, 是直接實現(xiàn)的; 取消了攔截條件, 現(xiàn)在只要是鍵盤消息全都攔截. unit Unit1; 鉤子函數(shù)為什么非得使用 stdcall 調(diào)用機制? 因為鉤子函數(shù)不是被應用程序調(diào)用, 而是被系統(tǒng)調(diào)用的 |
|
|