您的位置:首页 > 其它

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

2007-07-25 23:06 375 查看
表述能力不行,先把代码放上来,有时间在详细说明:

 


Imports System.Runtime.InteropServices






Public Class MyHookClass 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 <
a8c4
span style="color:#0000ff;">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

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐