啥是windows的鉤子?鉤子故名思議就是在嵌入到正常執行程序的功能。對于windows來說,每個系統和應用程序之間的交互是使用消息機制來進行。比如點擊應用程序上面的某個按鈕,就是發送了事件給了應用程序。windows鉤子的作用就是在事件發送給應用程序之前截獲事件,先對事件做處理,然后有兩個選擇,可以繼續拋出事件,也可以消滅時間。于是每個事件在windows上的相應都是一個事件處理鏈,沒增加一個處理的應用程序就是給這個事件處理鏈增加一個鏈接點而已。
創建鉤子
創建windows鉤子就需要三個步驟:
1 創建鉤子
2 相應鉤子接收的事件
3 卸載鉤子
?
window提供了鉤子的幾個接口:
http://msdn.microsoft.com/en-us/library/windows/desktop/ms632589(v=vs.85).aspx
?
其中最需要關注的是幾個:
SetWindowsHookEx
UnhookWindowsHookEx
CallNextHookEx
?
分別是安裝鉤子,卸載鉤子,執行下個鉤子操作。執行的順序如其名:先安裝鉤子,后處理事件,后調用下個鉤子,最后卸載鉤子。?
一個個看著三個接口:
SetWindowsHookEx
1 2 3 4 5 6 7 8 9 10 11 | HHOOK WINAPI SetWindowsHookEx( ?? _In_? int idHook, ?? _In_? HOOKPROC lpfn, ?? _In_? HINSTANCE hMod, ?? _In_? DWORD dwThreadId ); |
返回值是個HHOOK,就是鉤子的唯一標識,類型在c#中是個int型,如果安裝鉤子成功,返回一個int,如果安裝不成功,返回NULL。
參數:
idHook
idHook是個int類型,標識的是鉤子的類型,比如7代表鉤子監控鼠標事件,2代表鍵盤事件。這里不同的事件代表捕獲不同的消息,所以后面的消息處理事件也會有不同(這里說的不同不是事件的參數個數和類型不同,而是參數值的含義不同)。好了,這里有個問題,如果我要監控所有事件有辦法嗎?有,你可以使用4(WH_CALLWNDPROC)來捕獲所有消息。
lpfn
lpfn是個注冊回調事件,c#中可以使用delegate,這個事件大致是如下的接口:
1 2 3 4 5 6 7 8 9 | LRESULT CALLBACK CallWndProc( ?? _In_? int nCode, ?? _In_? WPARAM wParam, ?? _In_? LPARAM lParam ); |
即有三個參數和一個返回值
nCode:說明下事件如何處理消息,一般如果nCode是小于0的,那么就說明這個注冊事件不能做任何處理,應該把事件傳遞給下個鉤子。為0或者其他值根據idHook有不同的含義。
wParam:一般說明這個事件消息的類型。
lParam:一般是指向一個包含具體事件的結構。
hMod
hMod是個int類型,如果鉤子的注冊事件是由dll包含的話,值非零,如果是由當前進程包含的話,則設置為Intptr.Zero(NULL)
dwThreadId
dwThreadId也是說明這個鉤子注冊的回調事件的位置,如果是0的話,則注冊的回調事件是在當前線程的。如果不是在當前的線程,則dwThreadId是非0
UnhookWindowsHookEx
1 2 3 4 5 | BOOL WINAPI UnhookWindowsHookEx( ?? _In_? HHOOK hhk ); |
理解了SetWindowsHookEx之后,就很好理解UnhookWindowsHookEx了。
這里的HHOOK是SetWindowsHookEx函數的返回值,鉤子的唯一標識。
返回的BOOL代表卸載鉤子是否成功。
CallNextHookEx
1 2 3 4 5 6 7 8 9 10 11 | LRESULT WINAPI CallNextHookEx( ?? _In_opt_? HHOOK hhk, ?? _In_????? int nCode, ?? _In_????? WPARAM wParam, ?? _In_????? LPARAM lParam ); |
這個函數是用來讓事件隨著鉤子鏈繼續執行下去的。一般在注冊的回調事件中執行的,所以和注冊的回調事件有點像。
hhk:HHOOK類型(int)代表鉤子ID,但是實際上是被忽略的。
nCode,wParam,lParam具體的含義和注冊回調函數是一樣的。在使用的時候,只要將注冊回調函數接受到的參數直接傳遞給CallNextHookEx就可以了。
windows鉤子有什么作用?
借用msdn(http://msdn.microsoft.com/en-us/library/windows/desktop/ms644959(v=vs.85).aspx)上說的幾個用途:
1 調試使用(可以監視傳遞給應用的消息)
2 作為宏使用。(你可以將你在windows的任何動作錄制成宏)
3 監控F1動作來提供幫助。(很多應用上F1動作都是調出幫助信息的)
4 模擬鍵盤和鼠標操作
5 實現基于機器學習的應用(CBT computer-based training )
本文轉自軒脈刃博客園博客,原文鏈接:http://www.cnblogs.com/yjf512/archive/2013/05/13/3075179.html,如需轉載請自行聯系原作者