全域鍵盤訊號欄截、全域鍵盤Hook。keybord hook

摘要:全域鍵盤訊號欄截、全域鍵盤Hook。keybord hook

小弟在使用Yahoo的桌面工具時發現,它有一個按快速鍵即出現再按一次即隱藏的功能。讓小弟十分好奇它是如何辦到的。在搜集資訊之後寫了一個類別。

首先這個功能要運用到三個Win32Api:

1、SetWindowsHookExA:向系統註冊要欄截事件。

2、CallNextHookEx:將事件向下一個Handler引發。

3、UnhookWindowsHookEx:解除事件欄截。

首先宣告引用外部資源:

1   Private Declare Function SetWindowsHookEx Lib "user32" Alias "SetWindowsHookExA" _
2                (ByVal idHook As Integer, _
3                 ByVal lpfn As DelHookProc, _
4                 ByVal hmod As Integer, _
5                 ByVal dwThreadId As Integer) As Integer
6
7     Public Declare Function CallNextHookEx Lib "user32" Alias "CallNextHookEx" (ByVal idHook As Integer, ByVal ncode As Integer, ByVal wParam As Int32, ByVal lParam As IntPtr) As Integer
8
9     Public Declare Function UnhookWindowsHookEx Lib "user32" Alias "UnhookWindowsHookEx" (ByVal idHook As Integer) As Boolean

宣告委派:

  Public Delegate Function DelHookProc(ByVal nCode As Integer, ByVal wParam As Integer, ByVal lParam As IntPtr) As Integer
    Private Delegate Sub DelCallNextHook(ByVal ncode As Integer, ByVal wParam As Int32, ByVal lParam As IntPtr)

 

參數說明:

1、SetWindowsHookEx:

idHook:表示欄截哪一種資訊,keybord為13。還有很多種,小弟尚未測試是什麼功能。

lpfn:表示欄別到事件之後的事件處理函式,委派如"DelHookProc"。

hmod:接收事件的應用程式的 Handle。

dwThreadId:欄位截指定執行緒的事件,0代表全部。

回傳值:若為0則為Hook失敗。CallNextHookEx及解除Hook時所需的參數,數值的意義為Hook的Handle。

2、CallNextHookEx:

idHook:即SetWindowsHookEx()的回傳值。

ncode:尚不知他所代表的意義,希望先進提供資訊。

wParam尚不知他所代表的意義,希望先進提供資訊。

lParam:指標,指向記憶體中。存放此事件參數的位置。

3、UnhookWindowsHookEx:

idHook:欲解除Hook的Handle。

回傳值:布林值,成功失敗。

 

定義結構:事件中lParam所指向的位置,所承載的資料結構。

01     Public Structure KeyboardHookStruct
02
03         Public vkCode As Integer
04
05         Public scanCode As Integer
06
07         Public flags As Integer
08
09         Public time As Integer
10
11         Public dwExtraInfo As Integer
12
13     End Structure

結構屬性說明:

vkCode:按下的鍵的作業系統識別碼。

scanCode:按下的鍵的硬體識別碼。

其餘:小弟無法頓悟,請先進們指點。

 

開始欄截事件:

01 Public Function StartHook() As Integer
02         Dim MyModule As System.Reflection.Module = System.Reflection.Assembly.GetExecutingAssembly.GetModules()(0)
03         '取得應用程式的模組,請參閱.Net本質論首部曲。
04         Dim i As Integer = System.Runtime.InteropServices.Marshal.GetHINSTANCE(MyModule).ToInt32
05         '取得模組的Handle
06
08         Dim HookHandler As Integer =
SetWindowsHookEx(WH_KEYBOARD_LL, Me.Method, i, 0)
09         Return HookHandler
10     End Function

 

欄截事件:

01 Private Function HookProc(ByVal nCode As Integer, ByVal wParam As Integer, ByVal lParam As IntPtr) As Integer
02         If nCode >= 0 And wParam = &H100 Then
03             Dim KeyHookStruct As KeyboardHookStruct = System.Runtime.InteropServices.Marshal.PtrToStructure(lParam, GetType(KeyboardHookStruct))
04             '將指標位置轉為結構
05
06            Msgbox(KeyHookStruct .vkCode)
07         End If
08         '向下一個Hook引發傳送事件
09         Me.CallNextHookMethod.Invoke(nCode, wParam, lParam)
10 End Sub

停止Hook:

1     Public Sub StopHook()
2         UnhookWindowsHookEx(Me.HookHandler)
3     End Sub

 

以上…

其中仍有許多對小弟而言是待解之謎,希望先進們為小弟解答。若有錯誤的地方也歡迎指正。

 

 不止Know How 還要Know Why