C# SetWindowsHookEx仅适用于特定于钩子的键盘

C# SetWindowsHookEx仅适用于特定于钩子的键盘,c#,.net,vb.net,keyboard,low-level,C#,.net,Vb.net,Keyboard,Low Level,我试图从一个充当楔形键盘的RFID扫描仪中捕获所有按键 我有一个类,它使用SetWindowsHooEx来获取所有键盘按键。这意味着它还捕获了实际的键盘 我想知道是否有一种方法,我可以指定哪一个键盘挂钩的名称或隐藏(最好是名称) 如果有办法,请提供一个代码示例。 下面是我正在使用的键盘钩子类,仅供参考 Public Class KeyboardHook <DllImport("User32.dll", CharSet:=CharSet.Auto, CallingConventio

我试图从一个充当楔形键盘的RFID扫描仪中捕获所有按键

我有一个类,它使用SetWindowsHooEx来获取所有键盘按键。这意味着它还捕获了实际的键盘

我想知道是否有一种方法,我可以指定哪一个键盘挂钩的名称或隐藏(最好是名称)

如果有办法,请提供一个代码示例。

下面是我正在使用的键盘钩子类,仅供参考

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, 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
公共类键盘挂钩
Private将共享函数SetWindowsHookEx(ByVal idHook作为整数,ByVal HookProc作为KBDLLHookProc,ByVal hInstance作为IntPtr,ByVal wParam作为整数)重载为整数
端函数
私有重载共享函数CallNextHookEx(ByVal idHook作为整数,ByVal nCode作为整数,ByVal wParam作为IntPtr,ByVal lParam作为IntPtr)作为整数
端函数
私有重载共享函数unhookwindowshookx(ByVal idHook作为整数)作为布尔值
端函数
私有结构KBDLLHOOKSTRUCT
公共vkCode作为UInt32
公共扫描代码为UInt32
作为KBDLLHOOKSTRUCTFlags的公共标志
公共时间为UInt32
公共dwExtraInfo作为UIntPtr
端部结构
私有枚举KBDLLHOOKSTRUCTFlags作为UInt32
LLKHF_扩展=&H1
LLKHF_注入=&H10
LLKHF_ALTDOWN=&H20
LLKHF_UP=&H80
结束枚举
公共共享事件KeyDown(ByVal键作为键)
公共共享事件密钥(ByVal密钥作为密钥)
私有常量WH\u键盘LL为整数=13
私有常量HC_操作为整数=0
私有常量WM_KEYDOWN=&H100
私有常量WM_KEYUP=&H101
私有常量WM_SYSKEYDOWN=&H104
私有常量WM_SYSKEYUP=&H105
私有委托函数KBDLLHookProc(ByVal nCode作为整数,ByVal wParam作为IntPtr,ByVal lParam作为IntPtr)作为整数
私有KBDLLHookProc委托为KBDLLHookProc=新的KBDLLHookProc(KeyboardProc的地址)
私有HHookID作为IntPtr=IntPtr.Zero
私有函数KeyboardProc(ByVal nCode作为整数,ByVal wParam作为IntPtr,ByVal lParam作为IntPtr)作为整数
如果(nCode=HC\U动作),则
作为KBDLLHOOKSTRUCT的Dim结构
选择案例wParam
案例WM\U KEYDOWN,WM\U SYSKEYDOWN
RaiseEvent键关闭(CType(CType(Marshal.PtrToStructure(lParam,struct.GetType()),KBDLLHOOKSTRUCT.vkCode,键))
案例WM\U KEYUP,WM\U SYSKEYUP
RaiseEvent KeyUp(CType(CType(Marshal.PtrToStructure(lParam,struct.GetType()),KBDLLHOOKSTRUCT.vkCode,键))
结束选择
如果结束
Return CallNextHookEx(IntPtr.Zero、nCode、wParam、lParam)
端函数
公共分新()
HHookID=SetWindowsHookEx(WH_-KEYBOARD,kbdllhookprocedelegate,Marshal.GetHINSTANCE(System.Reflection.Assembly.getExecutionGassembly.GetModules()(0))。ToInt32,0)
如果HHookID=IntPtr.Zero,则
抛出新异常(“无法设置键盘挂钩”)
如果结束
端接头
受保护的覆盖子完成()
如果不是HHookID=IntPtr.Zero,则
胡克(胡克)
如果结束
MyBase.Finalize()
端接头
末级

RawInput是您需要的API,其中包括如何识别设备,您也可以使用SharpDX。RawInput:非常感谢Hoonigan和DogeAmazed为我指出了正确的方向。这正是我需要的。