啥是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
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,這個事件大致是如下的接口:
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
BOOL WINAPI UnhookWindowsHookEx( _In_ HHOOK hhk );
理解了SetWindowsHookEx之后,就很好理解UnhookWindowsHookEx了。
這里的HHOOK是SetWindowsHookEx函數的返回值,鈎子的唯一標識。
返回的BOOL代表卸載鈎子是否成功。
CallNextHookEx
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://wenku.baidu.com/view/5e3864e8551810a6f524863d.html
http://wenku.baidu.com/view/4f3aa61aff00bed5b9f31de4.html
http://msdn.microsoft.com/en-us/library/windows/desktop/ms632589(v=vs.85).aspx
http://www.cnblogs.com/starspace/archive/2008/11/06/1328393.html