鉤子(hook)技術,以其強大的功能,被廣泛的應用於系統監視,訊息管理。他可以在訊息到達目標視窗以前截獲訊息,並任意的處理系統訊息,達到一般應用程式無法達到的功能。本文主要從鉤子的種類,作用,應用入手,概要的介紹了鉤子技術的應用和作用。並附加乙個shell鉤子的例子和過程。
讀者評分 3 評分次數 1 正文
當你建立乙個鉤子時,windows系統會建立乙個資料結構,該結構包含了您建立的鉤子的資訊,安裝鉤子則是把該結構體插入到系統鉤子列表中去,注意:新插入的放置到舊的前面。當指定的鉤子事件被觸發後,區域性鉤子只需要呼叫程序中的鉤子函式來預處理事件,全域性鉤子則需要把處理插入到其他位址空間,要做到這一點,就需要有乙個動態連線庫,把鉤子函式放到庫中。但有兩個是例外,就是日誌鉤子和日誌回放鉤子,它是一種比較特殊的鉤子,它可以掛載到系統範圍內的任何程序中,而且不需要另外編寫乙個dll來對映到其他程序的記憶體空間之中(關於日誌鉤子,以後有機會再詳細介紹)。
一、鉤子的分類:
安裝不同的鉤子,可以截獲監視不同的訊息型別,有針對的對所需要的訊息進行過濾和處理,鉤子主要分以下幾類:
wh_callwndproc 傳送到視窗的訊息。由sendmessage觸發
wh_callwndprocret 傳送到視窗的訊息。由sendmessage處理完成返回時觸發
wh_getmessage 傳送到視窗的訊息。getmessage或peekmessage觸發
wh_keybroad 鍵盤鉤子,鍵盤觸發訊息。wm_keyup或wm_keydown訊息
wh_keybroad_ll 地層鍵盤鉤子
wh_mouse 滑鼠鉤子,查詢滑鼠事件訊息
wh_mouse_ll 低層鍵盤鉤子
wh_hardware 非滑鼠、鍵盤訊息時
wh_msgfilter 對話方塊、選單或滾動條要處理乙個訊息時。該鉤子是區域性的。
wh_sy**sgfilter 同wh_msgfilter一樣,系統範圍的。
wh_debug 除錯鉤子,用來給鉤子函式除錯
wh_journalrecord 監視和記錄輸入事件
wh_journalplayback 回放用wh_journalrecord記錄事件
wh_shell 外殼鉤子,當關於windows外殼事件發生時觸發.
wh_cbt 當基於計算機的訓練(cbt)事件發生時
wh_foregroundidle 前台應用程式執行緒變成空閒時候,鉤子啟用。
二、鉤子的型別:
全域性鉤子:全域性鉤子可以掛鉤其他程序的事件,有兩種:基於執行緒的,它將捕獲其它程序中某一特定執行緒的事件。簡言之,就是可以用來觀察其它程序中的某一特定執行緒將發生的事件。2,系統範圍的,將捕捉系統中所有程序將發生的事件訊息。
區域性鉤子:僅鉤掛您自己程序的事件。
三、安裝鉤子:
setwindowshookex
函式原形:hhook setwindowshookex(
int idhook, // 鉤子型別,見[一]
hookproc lpfn, // 鉤子函式位址
instance hmod, // 鉤子所在的例項的控制代碼,
dword dwthreadid // 鉤子所監視的執行緒的執行緒號
) hmod: 對於線程式鉤子,引數傳null;對於系統鉤子:引數為鉤子dll的控制代碼
dwthreadid:對於全域性鉤子,該引數為null。
返回:成功:返回setwindowshookex返回所安裝的鉤子控制代碼;
失敗:null;
四、解除安裝鉤子:
unhookwindowshookex
函式原形:bool unhookwindowshookex(
hhook hhk // 要解除安裝的鉤子控制代碼。
)五、鉤子函式:
myhookproc
鉤子函式是**函式。當安裝的鉤子被鉤到指定的事件訊息後,系統會自動呼叫鉤子函式進行處理。
定義如下:
lresult winapi myhookproc(
int ncode , // 指定是否需要處理該訊息
wparam wparam, // 包含該訊息的附加訊息
lparam lparam // 包含該訊息的附加訊息
) 六、呼叫下乙個鉤子
callnexthookex
java應用技術2
泛型 是一種把明確型別的工作推遲到建立物件或者呼叫方法的時候才去明確的特殊的型別。泛型玩的是引用資料型別。運用泛型的最大好處是避免了型別轉型異常。在泛型中不能用基礎資料型別如int只能用integer。泛型的安全警告 在申明時指定泛型的型別,如果沒指定就會在編譯時出現警告,但仍然可以執行,因為沒指定...
客戶端應用技術
一 html語言 1 html頁面組成 文件型別 根元素 頭元素 主體元素 2 html文字排版標記 段落標記 換行標記 標題標記 3 文字列表標記 無序列表 無序列表在每個列表項的前面加圓點符號。通過標記建立一組無序列表,每乙個列表項以標記表示。有序列表 有序列表在每個列表項的前面有序號。通過標記...
QLineEdit的應用技術整理
控制qlineedit的輸入範圍 1.使用正規表示式檢驗qlineedit的輸入範圍 如下 include include qlineedit lineedit new qlineedit this qregexp regexp a za z 1 9 0 9 1 9 0 9 和 1 9 d 上面的正...