鉤子函式

鉤子函式是Windows訊息處理機制的一部分,通過設定“鉤子”,應用程式可以在系統級對所有訊息、事件進行過濾,訪問在正常情況下無法訪問的訊息。鉤子的本質是一段用以處理系統訊息的程式,通過系統調用,把它掛入系統。

基本介紹

  • 中文名:鉤子函式
  • 外文名:Hook Function
鉤子函式,作用,類型,簡介,特例,解決方法,

鉤子函式

作用

WINDOWS的鉤子函式可以認為是WINDOWS的主要特性之一。利用它們,您可以捕捉您自己進程或其它進程發生的事件。通過“鉤掛”,您可以給WINDOWS一個處理或過濾事件的回調函式,該函式也叫做“鉤子函式”,當每次發生您感興趣的事件時,WINDOWS都將調用該函式。
在某種操作後彈出的關於鉤子函式的界面在某種操作後彈出的關於鉤子函式的界面

類型

一共有兩種類型的鉤子:局部的和遠程的。
局部鉤子僅鉤掛您自己進程的事件。
遠程的鉤子還可以將鉤掛其它進程發生的事件。
遠程的鉤子又有兩種:
鉤子分兩種, 一種是系統級的全局鉤子; 一種是執行緒級的鉤子.全局鉤子函式需要定義在 DLL 中, 執行緒級的鉤子開始比較簡單.
其實鉤子函式就三個:
設定鉤子: SetWindowsHookEx
釋放鉤子: UnhookWindowsHookEx
繼續鉤子: CallNextHookEx
線上程級的鉤子中經常用到 GetCurrentThreadID 函式來獲取當前執行緒的 ID

簡介

系統範圍的 將捕捉系統中所有進程將發生的事件訊息。 當您創建一個鉤子時,WINDOWS會先在記憶體中創建一個數據結構,該數據結構包含了鉤子的相關信息,然後把該結構體加到已經存在的鉤子鍊表中去。新的鉤子將加到老的前面。當一個事件發生時,如果您安裝的是一個局部鉤子,您進程中的鉤子函式將被調用。如果是一個遠程鉤子,系統就必須把鉤子函式插入到其它進程的地址空間,要做到這一點要求鉤子函式必須在一個動態程式庫中,所以如果您想要使用遠程鉤子,就必須把該鉤子函式放到動態程式庫中去。

特例

當然有兩個例外:工作日誌鉤子和工作日誌回放鉤子。這兩個鉤子的鉤子函式必須在安裝鉤子的執行緒中。原因是:這兩個鉤子是用來監控比較底層的硬體事件的,既然是記錄和回放,所有的事件就當然都是有先後次序的。所以如果把回調函式放在DLL中,輸入的事件被放在幾個執行緒中記錄,所以我們無法保證得到正確的次序。

解決方法

故解決的辦法是:把鉤子函式放到單個的執行緒中,譬如安裝鉤子的執行緒。
鉤子一共有14種,以下是它們被調用的時機:
WH_CALLWNDPROC 當調用SendMessage時
WH_CALLWNDPROCRET 當SendMessage的調用返回時
WH_GETMESSAGE 當調用GetMessage 或 PeekMessage時
WH_KEYBOARD 當調用GetMessage 或 PeekMessage 來從訊息佇列中查詢WM_KEYUP 或 WM_KEYDOWN 訊息時
WH_MOUSE 當調用GetMessage 或 PeekMessage 來從訊息佇列中查詢滑鼠事件訊息時
WH_HARDWARE 當調用GetMessage 或 PeekMessage 來從訊息佇列種查詢非滑鼠、鍵盤訊息時
WH_MSGFILTER 當對話框、選單或滾動條要處理一個訊息時。該鉤子是局部的。它是為那些有自己的訊息處理過程的控制項對象設計的。
WH_SYSMSGFILTER 和WH_MSGFILTER一樣,只不過是系統範圍的
WH_JOURNALRECORD 當WINDOWS從硬體佇列中獲得訊息時
WH_JOURNALPLAYBACK 當一個事件從系統的硬體輸入佇列中被請求時
WH_SHELL 當關於WINDOWS外殼事件發生時,譬如任務條需要重畫它的按鈕.
WH_CBT 當基於計算機的訓練(CBT)事件發生時
WH_FOREGROUNDIDLE 由WINDOWS自己使用,一般的應用程式很少使用
WH_DEBUG 用來給鉤子函式除錯
附:如何使用鉤子函式(接收到字母A按下時,窗體由最小化彈出的完整的代碼)
Public Declare Function CallNextHookEx Lib "user32" _
(ByVal hHook As Long, _
ByVal nCode As Long, _
ByVal wParam As Long, _
ByVal lParam As Long) As Long
Public Declare Function UnhookWindowsHookEx Lib "user32" _
(ByVal hHook As Long) As Long
Public Declare Function SetWindowsHookEx Lib "user32" _
Alias "SetWindowsHookExA" _
(ByVal idHook As Long, _
ByVal lpfn As Long, _
ByVal hmod As Long, _
ByVal dwThreadId As Long) As Long
Public Const WH_KEYBOARD = 2
Public Const KEY_WINSTART = 91
Public Const KEY_WINMENU = 93
Global hHook As Long
Public Function KeyboardProc(ByVal nCode As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
If nCode >= 0 Then
If wParam = KEY_WINMENU Or wParam = KEY_WINSTART Then
If (lParam And &HC0000000) = 0 Then
MsgBox "", , ""
Exit Function
End If
End If
End If
KeyboardProc = CallNextHookEx(hHook, nCode, wParam, lParam)
End Function
Option Explicit
Private Sub Command1_Click()
form2.Show 1
End Sub
Private Sub form_Load()
hHook = SetWindowsHookEx(WH_KEYBOARD, AddressOf KeyboardProc, 0&, App.ThreadID)
Me.Show
End Sub
Private Sub form_Unload(Cancel As Integer)
End Sub

相關詞條

熱門詞條

聯絡我們