VB.NET Keybord钩子和pinvok

VB.NET Keybord钩子和pinvok,vb.net,keyboard,pinvoke,Vb.net,Keyboard,Pinvoke,您好,我有一个VB NET程序,它使用以下类(http://sim0n.wordpress.com/2009/03/28/vbnet-keyboard-hook-class/)要钩住钥匙扣: Imports System.Runtime.InteropServices Public Class KeyboardHook <DllImport("User32.dll", CharSet:=CharSet.Auto, CallingConvention:=CallingConven

您好,我有一个VB NET程序,它使用以下类(http://sim0n.wordpress.com/2009/03/28/vbnet-keyboard-hook-class/)要钩住钥匙扣:

Imports System.Runtime.InteropServices

Public Class KeyboardHook

    <DllImport("User32.dll", CharSet:=CharSet.Auto, CallingConvention:=CallingConvention.StdCall)> _
    Private Overloads Shared Function SetWindowsHookEx(ByVal idHook As Integer, ByVal HookProc As KBDLLHookProc, ByVal hInstance As IntPtr, ByVal wParam As Integer) As Integer
    End Function
    <DllImport("User32.dll", CharSet:=CharSet.Auto, CallingConvention:=CallingConvention.StdCall)> _
    Private Overloads Shared Function CallNextHookEx(ByVal idHook As Integer, ByVal nCode As Integer, ByVal wParam As IntPtr, ByVal lParam As IntPtr) As Integer
    End Function
    <DllImport("User32.dll", CharSet:=CharSet.Auto, CallingConvention:=CallingConvention.StdCall)> _
    Private Overloads Shared Function UnhookWindowsHookEx(ByVal idHook As Integer) As Boolean
    End Function

    <StructLayout(LayoutKind.Sequential)> _
    Private Structure KBDLLHOOKSTRUCT
        Public vkCode As UInt32
        Public scanCode As UInt32
        Public flags As KBDLLHOOKSTRUCTFlags
        Public time As UInt32
        Public dwExtraInfo As UIntPtr
    End Structure

    <Flags()> _
    Private Enum KBDLLHOOKSTRUCTFlags As UInt32
        LLKHF_EXTENDED = &H1
        LLKHF_INJECTED = &H10
        LLKHF_ALTDOWN = &H20
        LLKHF_UP = &H80
    End Enum

    Public Shared Event KeyDown(ByVal Key As Keys)
    Public Shared Event KeyUp(ByVal Key As Keys)

    Private Const WH_KEYBOARD_LL As Integer = 13
    Private Const HC_ACTION As Integer = 0
    Private Const WM_KEYDOWN = &H100
    Private Const WM_KEYUP = &H101
    Private Const WM_SYSKEYDOWN = &H104
    Private Const WM_SYSKEYUP = &H105

    Private Delegate Function KBDLLHookProc(ByVal nCode As Integer, ByVal wParam As IntPtr, ByVal lParam As IntPtr) As Integer

    Private KBDLLHookProcDelegate As KBDLLHookProc = New KBDLLHookProc(AddressOf KeyboardProc)
    Private HHookID As IntPtr = IntPtr.Zero

    Private Function KeyboardProc(ByVal nCode As Integer, ByVal wParam As IntPtr, ByVal lParam As IntPtr) As Integer
        If (nCode = HC_ACTION) Then
            Dim struct As KBDLLHOOKSTRUCT
            Select Case wParam
                Case WM_KEYDOWN, WM_SYSKEYDOWN
                    RaiseEvent KeyDown(CType(CType(Marshal.PtrToStructure(lParam, struct.GetType()), KBDLLHOOKSTRUCT).vkCode, Keys))
                Case WM_KEYUP, WM_SYSKEYUP
                    RaiseEvent KeyUp(CType(CType(Marshal.PtrToStructure(lParam, struct.GetType()), KBDLLHOOKSTRUCT).vkCode, Keys))
            End Select
        End If
        Return CallNextHookEx(IntPtr.Zero, nCode, wParam, lParam)
    End Function

    Public Sub New()
        HHookID = SetWindowsHookEx(WH_KEYBOARD_LL, KBDLLHookProcDelegate, System.Runtime.InteropServices.Marshal.GetHINSTANCE(System.Reflection.Assembly.GetExecutingAssembly.GetModules()(0)).ToInt32, 0)
        If HHookID = IntPtr.Zero Then
            Throw New Exception("Could not set keyboard hook")
        End If
    End Sub

    Protected Overrides Sub Finalize()
        If Not HHookID = IntPtr.Zero Then
            UnhookWindowsHookEx(HHookID)
        End If
        MyBase.Finalize()
    End Sub

End Class

我要寻找的是捕获所有用户输入,并将它们与一个单词列表进行比较,如果这些输入匹配,将弹出一个消息框,显示“找到匹配项”。实际上,每次按下一个按键,就会显示一个消息框,其中键入了键值。我听说了关于pinvoke的低级钩子,但我不知道它是什么以及如何使用它。这里有一个链接,更好地描述了我想要什么(http://www.youtube.com/watch?v=OgoDzkboT0A)提前感谢您提供的任何有用信息

我认为最好的办法是缓冲所有按键,并在每次输入后检查该值是否是您的关键字之一。当按下空格键、tab键或enter键时,可能需要重置缓冲区。您可能还希望处理退格以删除缓冲区中的最后一个字符。祝你好运

Private Buffer As String
Private Words As String() = New String() {"bank", "rob", "money"}

Private Sub TextBox1_KeyDown(sender As Object, e As KeyEventArgs) Handles TextBox1.KeyDown
    If e.KeyCode = Keys.Space Then
        Buffer = String.Empty
    Else
        Buffer &= Convert.ToChar(e.KeyCode)
    End If

    If Not Array.IndexOf(Words, Buffer.ToLower()) = -1 Then
        MessageBox.Show("Match found!")
    End If
End Sub
Private Buffer As String
Private Words As String() = New String() {"bank", "rob", "money"}

Private Sub TextBox1_KeyDown(sender As Object, e As KeyEventArgs) Handles TextBox1.KeyDown
    If e.KeyCode = Keys.Space Then
        Buffer = String.Empty
    Else
        Buffer &= Convert.ToChar(e.KeyCode)
    End If

    If Not Array.IndexOf(Words, Buffer.ToLower()) = -1 Then
        MessageBox.Show("Match found!")
    End If
End Sub