++++{ 源代碼:Mousehook、Mouse }+++++
---------------------------------------------------------------------------------------
原理:
鉤子程序在特定消息發送沒達到目的窗口之前,將消息截獲,做出想要的處理,最後發送給目標窗口或不發送。
消息種類:
如鍵盤鉤子、鼠標鉤子、外殼鉤子->截獲啟動和關閉應用程序的消息、日誌鉤子->監視和記錄輸入事件。
建立多個鉤子系統會建立一個鉤子鏈錶,運作方式類似於棧,鉤子安裝順序遵從後來居上,捕獲的消息從表頭流向表尾。
最後安裝的鉤子最有可能處理該消息。
基本函數:
1.安裝鉤子;
在程序初始化的時候,調用函數SetWindowsHookEx安裝鉤子。
函數原型:
HHOOK SetWindowsHookEx(int idHook,//鉤子類型
HOOK PROClpfn,//鉤子函數的地址
INSTANCE hMod,//鉤子函數所在的實例的句柄;對於線程鉤子,為NULL;對於系統鉤子,參數為鉤子函數所在的DLL句柄
DORD dwThreadId //指定鉤子所監視的線程的線程號。全局鉤子,該參數為NULL
)
SetWindowsHookEx返回所安裝的鉤子句柄
2.定義鉤子函數:
LRESULT CALLBACK HookProc(int nCode, WPARAM wParam, LPARAM lParam)
參數 wParam 和 lParam 包含所鉤消息信息。
nCode包含有關消息的本身。
用函數 CallNextHookEx 八鉤子信息傳遞給鉤子鏈的下一個鉤子函數。
CallNextHookEx.的原型如下:
LRESULT CallNextHookEx(HHOOK hhk, int nCode,WPARAM wParam,LPARAM lParam)
hhk是鉤子句柄。
nCode、wParam和lParam是鉤子函數的參數。
當然也可以通過直接返回TRUE來丟棄該消息,就阻止了該消息的傳遞。
3.卸載鉤子:
當不再使用鉤子時,必須及時卸載。簡單的調用函數:
BOOL UnhookWindowsHookEx(HHOOK hhk)即可。
--------------------------------------------------------------------------------------
鉤子函數具體類型:
-------------------
1.WH_CALLWNDPROC //窗口鉤子,當系統向目標發送消息時將觸發此鉤子
2.WH_CALLWNDPROCRET //窗口鉤子,當窗口處理完消息后將觸發此鉤子
3.WH_CBT //系統級鉤子,當 Windows 激活、產生、釋放、最大化、最小化或改變窗口時都將觸發此事件。
4.WH_DEBUG //調試鉤子
5.WH_GETMESSAGE //當網消息隊列中增加一個消息時將觸發此鉤子
6.WH_JOURNALPLAYBACK //回放鉤子,可以用戶與播放已記錄的鼠標和鍵盤操作
7.WH_JOURNALRECORD //記錄鉤子,可以用於記錄鼠標和鍵盤操作,木馬程序使用此鉤子盜取從鍵盤敲入的密碼
8.WH_KEYBOARD //當敲擊鍵盤時觸發
9.WH_MOUSE //有鼠標操作時觸發此鉤子
10.WH_MSGFILTER //消息過濾鉤子
11.WH_SHELL //Shell鉤子
12.WH_SYSMSGFILTER //系統消息過濾鉤子
13.WH_HARDWARE 當調用 GetMessage 或 PeekMessage 來從消息隊列中查詢非鼠標鍵盤消息時
14.WH_FOREGROUNDIDLE 由WINDOWS自己使用,一般的應用程序很少使用
(1)如果對於同一事件(如滑鼠消息)既安裝了執行緒勾子又安裝了系統勾子,那麼系統會自動先調用執行緒勾子,然後調用系統勾子。
(2)對同一事件消息可安裝多個勾子處理過程,這些勾子處理過程形成了勾子鏈。當前勾子處理結束後應把勾子資訊傳遞給下一個勾子函數。
(3)勾子特別是系統勾子會消耗消息處理時間,降低系統性能。只有在必要的時候才安裝勾子,在使用完畢後要及時卸載。