表述能力不行,先把代码放上来,有时间在详细说明:
Imports
System.Runtime.InteropServices
Public Class MyHook Class MyHook
'Hook键盘
Private Const WH_KEYBOARD As Integer = 2
'Hook返回值
Private hHook As Integer = 0
'定义引用变量防止CallbackOnCollectedDelegate错误的产生
Private HookProc As CallBack
'回调函数
Public Delegate Function CallBack()Function CallBack(ByVal nCode As Integer, ByVal wParam As IntPtr, ByVal lParam As IntPtr) As Integer
'事件
Public Event KeyDown As System.Windows.Forms.KeyEventHandler
Public Event KeyUp As System.Windows.Forms.KeyEventHandler
'获取线程ID的API声明
<DllImport("kernel32.dll", CharSet:=CharSet.Auto, CallingConvention:=CallingConvention.StdCall)> _
Public Overloads Shared Function GetCurrentThreadId()Function GetCurrentThreadId() As Integer
End Function
'设置Hook的API声明
<DllImport("User32.dll", CharSet:=CharSet.Auto, CallingConvention:=CallingConvention.StdCall)> _
Public Overloads Shared Function SetWindowsHookEx()Function SetWindowsHookEx( _
ByVal idHook As Integer, ByVal HookProc As CallBack, _
ByVal hInstance As IntPtr, ByVal wParam As Integer) As Integer
End Function
'处理下一Hook的API声明
<DllImport("User32.dll", CharSet:=CharSet.Auto, CallingConvention:=CallingConvention.StdCall)> _
Public Overloads Shared Function CallNextHookEx()Function CallNextHookEx( _
ByVal idHook As Integer, ByVal nCode As Integer, _
ByVal wParam As IntPtr, ByVal lParam As IntPtr) As Integer
End Function
'移除Hook的API声明
<DllImport("User32.dll", CharSet:=CharSet.Auto, CallingConvention:=CallingConvention.StdCall)> _
Public Overloads Shared Function UnhookWindowsHookEx()Function UnhookWindowsHookEx( _
ByVal idHook As Integer) As Boolean
End Function
'安装Hook,类型键盘线程钩子,失败返回0,成功返回钩子句柄
Public Function SetHook()Function SetHook() As Integer
HookProc = New CallBack(AddressOf KeyBoardProc)
hHook = SetWindowsHookEx(WH_KEYBOARD, HookProc, IntPtr.Zero, GetCurrentThreadId)
Return hHook
End Function
'钩子处理子程
Private Function KeyBoardProc()Function KeyBoardProc( _
ByVal nCode As Integer, _
ByVal wParam As IntPtr, _
ByVal lParam As IntPtr) As Integer
'
If nCode = 0 Then
If lParam.ToInt32 > 0 Then
'处理键盘KeyDown事件
RaiseEvent KeyDown(Me, New Windows.Forms.KeyEventArgs(CType(wParam, Windows.Forms.Keys)))
End If
If lParam.ToInt32 < 0 Then
'处理键盘KeyUp事件
RaiseEvent KeyUp(Me, New Windows.Forms.KeyEventArgs(CType(wParam, Windows.Forms.Keys)))
End If
End If
Return CallNextHookEx(hHook, nCode, wParam, lParam)
End Function
'移除Hook,成功返回True,失败返回False
Public Function UnHook()Function UnHook() As Boolean
Return UnhookWindowsHookEx(hHook)
End Function
End Class
Public Class MyHook Class MyHook
'Hook键盘
Private Const WH_KEYBOARD As Integer = 2
'Hook返回值
Private hHook As Integer = 0
'定义引用变量防止CallbackOnCollectedDelegate错误的产生
Private HookProc As CallBack
'回调函数
Public Delegate Function CallBack()Function CallBack(ByVal nCode As Integer, ByVal wParam As IntPtr, ByVal lParam As IntPtr) As Integer
'事件
Public Event KeyDown As System.Windows.Forms.KeyEventHandler
Public Event KeyUp As System.Windows.Forms.KeyEventHandler
'获取线程ID的API声明
<DllImport("kernel32.dll", CharSet:=CharSet.Auto, CallingConvention:=CallingConvention.StdCall)> _
Public Overloads Shared Function GetCurrentThreadId()Function GetCurrentThreadId() As Integer
End Function
'设置Hook的API声明
<DllImport("User32.dll", CharSet:=CharSet.Auto, CallingConvention:=CallingConvention.StdCall)> _
Public Overloads Shared Function SetWindowsHookEx()Function SetWindowsHookEx( _
ByVal idHook As Integer, ByVal HookProc As CallBack, _
ByVal hInstance As IntPtr, ByVal wParam As Integer) As Integer
End Function
'处理下一Hook的API声明
<DllImport("User32.dll", CharSet:=CharSet.Auto, CallingConvention:=CallingConvention.StdCall)> _
Public Overloads Shared Function CallNextHookEx()Function CallNextHookEx( _
ByVal idHook As Integer, ByVal nCode As Integer, _
ByVal wParam As IntPtr, ByVal lParam As IntPtr) As Integer
End Function
'移除Hook的API声明
<DllImport("User32.dll", CharSet:=CharSet.Auto, CallingConvention:=CallingConvention.StdCall)> _
Public Overloads Shared Function UnhookWindowsHookEx()Function UnhookWindowsHookEx( _
ByVal idHook As Integer) As Boolean
End Function
'安装Hook,类型键盘线程钩子,失败返回0,成功返回钩子句柄
Public Function SetHook()Function SetHook() As Integer
HookProc = New CallBack(AddressOf KeyBoardProc)
hHook = SetWindowsHookEx(WH_KEYBOARD, HookProc, IntPtr.Zero, GetCurrentThreadId)
Return hHook
End Function
'钩子处理子程
Private Function KeyBoardProc()Function KeyBoardProc( _
ByVal nCode As Integer, _
ByVal wParam As IntPtr, _
ByVal lParam As IntPtr) As Integer
'
If nCode = 0 Then
If lParam.ToInt32 > 0 Then
'处理键盘KeyDown事件
RaiseEvent KeyDown(Me, New Windows.Forms.KeyEventArgs(CType(wParam, Windows.Forms.Keys)))
End If
If lParam.ToInt32 < 0 Then
'处理键盘KeyUp事件
RaiseEvent KeyUp(Me, New Windows.Forms.KeyEventArgs(CType(wParam, Windows.Forms.Keys)))
End If
End If
Return CallNextHookEx(hHook, nCode, wParam, lParam)
End Function
'移除Hook,成功返回True,失败返回False
Public Function UnHook()Function UnHook() As Boolean
Return UnhookWindowsHookEx(hHook)
End Function
End Class