钩子学习:一个键盘线程钩子的实现

表述能力不行,先把代码放上来,有时间在详细说明:

 

Imports  System.Runtime.InteropServices

Public   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(ByVal nCode As IntegerByVal 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() As Integer

    
End Function


    
'设置Hook的API声明
    <DllImport("User32.dll", CharSet:=CharSet.Auto, CallingConvention:=CallingConvention.StdCall)> _
    
Public Overloads Shared Function SetWindowsHookEx( _
        
ByVal idHook As IntegerByVal HookProc As CallBack, _
        
ByVal hInstance As IntPtr, ByVal wParam As IntegerAs Integer

    
End Function


    
'处理下一Hook的API声明
    <DllImport("User32.dll", CharSet:=CharSet.Auto, CallingConvention:=CallingConvention.StdCall)> _
    
Public Overloads Shared Function CallNextHookEx( _
        
ByVal idHook As IntegerByVal 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( _
        
ByVal idHook As IntegerAs Boolean
    
End Function


    
'安装Hook,类型键盘线程钩子,失败返回0,成功返回钩子句柄
    Public Function SetHook() As Integer

        HookProc 
= New CallBack(AddressOf KeyBoardProc)
        hHook 
= SetWindowsHookEx(WH_KEYBOARD, HookProc, IntPtr.Zero, GetCurrentThreadId)

        
Return hHook

    
End Function


    
'钩子处理子程
    Private 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(MeNew Windows.Forms.KeyEventArgs(CType(wParam, Windows.Forms.Keys)))
            
End If
            
If lParam.ToInt32 < 0 Then
                
'处理键盘KeyUp事件
                RaiseEvent KeyUp(MeNew 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() As Boolean

        
Return UnhookWindowsHookEx(hHook)

    
End Function


End Class

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值