HOOK的理解

    一不小心點了一下csdn的blog,卻發現自己不知道什麼時候已經註冊了,嘿嘿,一直也沒有在這裏留下任何印記,罪過。剛好今天看了孫鑫的最後一課,寫一下自己對HOOK的理解吧。

    HOOK,也就是鉤子函數,要理解這個,首先要明白windows的回調機制。windows程序必須要有一個窗口,有了窗口才能接收消息。當收到任何消息的時候,總是由windows系統來對程序在註冊窗口類的時候註冊的窗口函數進行調用,發給程序的所有的消息都是在這個窗口過程中進行處理。那麼我們想攔截消息的話,最方便的地方應該是在哪裏?

    當然是在系統調用窗口函數前,在系統中對消息進行攔截。而HOOK函數的作用就是這個,使用HOOK前先要進行安裝,調用SetWindowsHookEx函數,其函數原型爲:

HHOOK SetWindowsHookEx(
  int idHook,        // hook type
  HOOKPROC lpfn,     // hook procedure
  HINSTANCE hMod,    // handle to application instance
  DWORD dwThreadId   // thread identifier
);
第一個參數爲HOOK類型,也就是你要選擇鍵盤鉤子還是鼠標鉤子(當然鉤子的種類很多,自己慢慢選:))
第二個參數就是鉤子回調函數,也就是你勾掛上消息(攔截消息總不能白攔截吧,起碼打上自己的標記吧)
後,可以在這個函數中對消息進行處理,方法同窗口回調函數。
第三個參數是一個DLL句柄,如果你安裝一個本地鉤子,那麼就應該把這個參數設爲NULL,否則就
應該是你的鉤子函數所在的DLL的句柄(除了本地鉤子外,其他鉤子都應該在一個DLL文件中,這個我也
不知道爲什麼,呵呵)。
第四個參數是線程ID,如果是本地鉤子,用函數GetCurrentThreadID就好,如果這個參數爲0,
那麼就安裝一個全局鉤子,也就是說系統桌面上運行的所有程序的消息都要先從你這裏經過,
厲害吧,如果在這裏隨便做個手腳,呵呵。
這個函數的返回值是一個HHOOK的句柄,一般在卸載鉤子的時候使用。
說了安裝,當然要說卸載了。
卸載的時候使用UnhookWindowsHookEx這個函數
BOOL UnhookWindowsHookEx(
  HHOOK    // handle to hook procedure
);
其中唯一的參數就是前面安裝的時候的HHOOK句柄,當然你安裝了幾個鉤子就要卸載幾次了。
一下子打了這麼多,累啊。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章