摘要:全域鍵盤訊號欄截、全域鍵盤Hook。keybord hook
小弟在使用Yahoo的桌面工具時發現,它有一個按快速鍵即出現再按一次即隱藏的功能。讓小弟十分好奇它是如何辦到的。在搜集資訊之後寫了一個類別。
首先這個功能要運用到三個Win32Api:
1、SetWindowsHookExA:向系統註冊要欄截事件。
2、CallNextHookEx:將事件向下一個Handler引發。
3、UnhookWindowsHookEx:解除事件欄截。
首先宣告引用外部資源:
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 Integer6

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 Integer8

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所指向的位置,所承載的資料結構。
Public Structure KeyboardHookStruct02

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:按下的鍵的硬體識別碼。
其餘:小弟無法頓悟,請先進們指點。
開始欄截事件:
Public Function StartHook() As Integer02
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).ToInt3205
'取得模組的Handle06

08
Dim HookHandler As Integer = SetWindowsHookEx(WH_KEYBOARD_LL, Me.Method, i, 0)09
Return HookHandler10
End Function
欄截事件:
Private Function HookProc(ByVal nCode As Integer, ByVal wParam As Integer, ByVal lParam As IntPtr) As Integer02
If nCode >= 0 And wParam = &H100 Then03
Dim KeyHookStruct As KeyboardHookStruct = System.Runtime.InteropServices.Marshal.PtrToStructure(lParam, GetType(KeyboardHookStruct))04
'將指標位置轉為結構05

06 Msgbox(KeyHookStruct .vkCode)
07
End If08
'向下一個Hook引發傳送事件09
Me.CallNextHookMethod.Invoke(nCode, wParam, lParam)10
End Sub停止Hook:
Public Sub StopHook()2
UnhookWindowsHookEx(Me.HookHandler)3
End Sub
以上…
其中仍有許多對小弟而言是待解之謎,希望先進們為小弟解答。若有錯誤的地方也歡迎指正。
不止Know How 還要Know Why
Public
Public