SetWindowsHook詳解及應用實例

HHOOK WINAPI SetWindowsHookEx(
  _In_ int       idHook,
  _In_ HOOKPROC  lpfn,
  _In_ HINSTANCE hMod,
  _In_ DWORD     dwThreadId
);
參數說明
idHook
Type: int


WH_CALLWNDPROC(4): 安裝一個掛鉤處理過程,在系統將消息發送至目標窗口處理過程之前,對該消息進行監視,詳情參見CallWndProc掛鉤處理過程.


WH_CALLWNDPROCRET(12) :安裝一個掛鉤處理過程,它對已被目標窗口處理過程處理過了的消息進行監視,詳情參見 CallWndRetProc 掛鉤處理過程.


WH_CBT(5) :安裝一個掛鉤處理過程,接受對CBT應用程序有用的消息 ,詳情參見 CBTProc 掛鉤處理過程.


WH_DEBUG(9):安裝一個掛鉤處理過程以便對其他掛鉤處理過程進行調試, 詳情參見DebugProc掛鉤處理過程.


WH_FOREGROUNDIDLE(11):安裝一個掛鉤處理過程,該掛鉤處理過程當應用程序的前臺線程即將進入空閒狀態時被調用,它有助於在空閒時間內執行低優先級的任務.


WH_GETMESSAGE(3):安裝一個掛鉤處理過程對寄送至消息隊列的消息進行監視,詳情參見 GetMsgProc 掛鉤處理過程.


WH_JOURNALPLAYBACK(1):安裝一個掛鉤處理過程,對此前由WH_JOURNALRECORD 掛鉤處理過程紀錄的消息進行寄送.詳情參見 JournalPlaybackProc掛鉤處理過程.


WH_JOURNALRECORD(0):安裝一個掛鉤處理過程,對寄送至系統消息隊列的輸入消息進行紀錄.詳情參見JournalRecordProc掛鉤處理過程.


WH_KEYBOARD(2):安裝一個掛鉤處理過程對擊鍵消息進行監視. 詳情參見KeyboardProc掛鉤處理過程.


WH_KEYBOARD_LL(13):此掛鉤只能在Windows NT中被安裝,用來對底層的鍵盤輸入事件進行監視.詳情參見LowLevelKeyboardProc掛鉤處理過程.


WH_MOUSE(7):安裝一個掛鉤處理過程,對鼠標消息進行監視. 詳情參見 MouseProc掛鉤處理過程.


WH_MOUSE_LL(14):此掛鉤只能在Windows NT中被安裝,用來對底層的鼠標輸入事件進行監視.詳情參見LowLevelMouseProc掛鉤處理過程.


WH_MSGFILTER(-1):安裝一個掛鉤處理過程, 以監視由對話框、消息框、菜單條、或滾動條中的輸入事件引發的消息.詳情參見MessageProc掛鉤處理過程.


WH_SHELL(10):安裝一個掛鉤處理過程以接受對外殼應用程序有用的通知, 詳情參見 ShellProc掛鉤處理過程.


WH_SYSMSGFILTER(6):安裝一個掛鉤處理過程,以監視由對話框、消息框、菜單條、或滾動條中的輸入事件引發的消息.這個掛鉤處理過程對系統中所有應用程序的這類消息都進行監視.詳情參見 SysMsgProc掛鉤處理過程.




lpfn
Type:HOOKPROC


回調函數需要return CallNextHookEx(不同鉤子參數不同)


指向相應的掛鉤處理過程.若參數dwThreadId爲0或者指示了一個其他進程創建的線程之標識符,則參數lpfn必須指向一個動態鏈接中的掛鉤處理過程.
否則,參數lpfn可以指向一個與當前進程相關的代碼中定義的掛鉤處理過程.


hMod
Type:HINSTANCE
指示了一個動態鏈接的句柄,該動態連接庫包含了參數lpfn 所指向的掛鉤處理過程.若參數dwThreadId指示的線程由當前進程創建,並且相應的掛鉤處理過程定義於當前進程相關的代碼中,則參數hMod必須被設置爲NULL(0).


dwThreadId
Type:DWORD
指示了一個線程標識符,掛鉤處理過程與線程相關.若此參數值爲0,則該掛鉤處理過程與所有現存的線程相關


返回值
若此函數執行成功,則返回值就是該掛鉤處理過程的句柄;若此函數執行失敗,則返回值爲NULL(0).若想獲得更多錯誤信息,請調用GetLasError函數.




備註:
若參數hMod爲NULL,而參數dwThreadld爲0或者指示了一個其他進程創建的線程標識符,則會產生錯誤.


對函數CallNextHookEx進行調用以下鏈接下一個掛鉤處理過程是可選的,但也是被推薦的否則,其他安裝了此掛鉤的應用程序將無法獲得此掛鉤通知,從而可能導致錯誤的行爲.除非您確實希望防止其他應用程序看到此掛鉤通知,您應當調用函數CallNextHookEx.


在終止一個應用程序之前,必須調用函數UnhookWindowsHookEx以釋放與此掛鉤相關的系統資源


掛鉤的作用域依賴與掛鉤的類型.一些掛鉤只能被設置成系統作用域,其他掛鉤(如下所示)還可以被設置爲某一特定線程的作用域:
WH_CALLWNDPROC 線程或系統
WH_CALLWNDPROCRET 線程或系統
WH_CBT 線程或系統
WH_DEBUG 線程或系統
WH_FOREGROUNDIDLE 線程或系統
WH_GETMESSAGE 線程或系統
WH_JOURNALPLAYBACK 系統
WH_JOURNALRECORD 系統
WH_KEYBOARD 線程或系統
WH_KEYBOARD_LL 線程或系統
WH_MOUSE 線程或系統
WH_MOUSE_LL 線程或系統
WH_MSGFILTER 線程或系統
WH_SHELL 線程或系統

WH_SYSMSGFILTER 系統

HHOOK keyboardHook;

LRESULT CALLBACK KeyboardProc(
  _In_ int    code,
  _In_ WPARAM wParam,
  _In_ LPARAM lParam
)
{
	::MessageBox(NULL,"按鍵了","caption",0x00000002L);
	return CallNextHookEx(keyboardHook,code,wParam,lParam);//第一個參數一般可以爲NULL
}

//在對應線程設置鍵盤鉤子
void setHook(DWORD threadId)//需要hook的線程ID
{
	//hook其他進程中的線程
	keyboardHook = SetWindowsHookEx(WH_KEYBOARDPROC,KeyboardProc,GetModuleHandle("mydll.dll"),threadId);//"mydll.dll"裏實現了KeyboardProc
	//hook自身進程中的線程
	//hhook = SetWindowsHookEx(WH_KEYBOARDPROC,KeyboardProc,NULL,threadId);
}



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章