Vb.net 键盘挂钩,防止键盘输入到应用程序

Vb.net 键盘挂钩,防止键盘输入到应用程序,vb.net,keyboard,keyboard-hook,Vb.net,Keyboard,Keyboard Hook,我正在努力学习键盘挂钩是如何工作的,但我失败了。我收集了以下代码,这些代码实现了我所希望的功能。 我试图做的是截取某些键盘输入并执行我的代码,而不是将这些特定的键盘输入传递回应用程序。我的代码能够截取键盘输入并执行我的代码,但键盘输入总是在代码执行后传递到应用程序。有什么建议吗 Imports System Imports System.Runtime.CompilerServices Imports System.Runtime.InteropServices Imports System.W

我正在努力学习键盘挂钩是如何工作的,但我失败了。我收集了以下代码,这些代码实现了我所希望的功能。
我试图做的是截取某些键盘输入并执行我的代码,而不是将这些特定的键盘输入传递回应用程序。我的代码能够截取键盘输入并执行我的代码,但键盘输入总是在代码执行后传递到应用程序。有什么建议吗

Imports System
Imports System.Runtime.CompilerServices
Imports System.Runtime.InteropServices
Imports System.Windows.Forms


Friend Class KeyboardHooking
' Methods
<DllImport("user32.dll", CharSet:=CharSet.Auto, SetLastError:=True)> _
Private Shared Function CallNextHookEx(ByVal hhk As IntPtr, ByVal nCode As Integer, ByVal wParam As IntPtr, ByVal lParam As IntPtr) As IntPtr
End Function

<DllImport("kernel32.dll", CharSet:=CharSet.Auto, SetLastError:=True)> _
Private Shared Function GetModuleHandle(ByVal lpModuleName As String) As IntPtr
End Function

Private Shared Function HookCallback(ByVal nCode As Integer, ByVal wParam As IntPtr, ByVal lParam As IntPtr) As Integer
    If ((nCode >= 0) AndAlso (nCode = 0)) Then
        Dim keyData As Keys = DirectCast(CInt(wParam), Keys)

        If ((BindingFunctions.IsKeyDown(Keys.ControlKey) AndAlso BindingFunctions.IsKeyDown(Keys.ShiftKey)) AndAlso BindingFunctions.IsKeyDown(My.Settings.keyLinkQuickToDB)) Then
            linkQuickToDB()

        'Qty Changer
        ElseIf ((BindingFunctions.IsKeyDown(Keys.ControlKey) AndAlso BindingFunctions.IsKeyDown(Keys.ShiftKey)) AndAlso BindingFunctions.IsKeyDown(My.Settings.keyQtyChange)) Then
            qtyChanger()
        End If
    End If

    Return CInt(KeyboardHooking.CallNextHookEx(KeyboardHooking._hookID, nCode, wParam, lParam))

End Function

Public Shared Sub ReleaseHook()
    KeyboardHooking.UnhookWindowsHookEx(KeyboardHooking._hookID)
End Sub

Public Shared Sub SetHook()
    KeyboardHooking._hookID = KeyboardHooking.SetWindowsHookEx(2, KeyboardHooking._proc, IntPtr.Zero, Convert.ToUInt32(AppDomain.GetCurrentThreadId))
End Sub

<DllImport("user32.dll", CharSet:=CharSet.Auto, SetLastError:=True)> _
Private Shared Function SetWindowsHookEx(ByVal idHook As Integer, ByVal lpfn As LowLevelKeyboardProc, ByVal hMod As IntPtr, ByVal dwThreadId As UInt32) As IntPtr
End Function

<DllImport("user32.dll", CharSet:=CharSet.Auto, SetLastError:=True)> _
Private Shared Function UnhookWindowsHookEx(ByVal hhk As IntPtr) As <MarshalAs(UnmanagedType.Bool)> Boolean
End Function


' Fields
Private Shared _hookID As IntPtr = IntPtr.Zero
Private Shared _proc As LowLevelKeyboardProc = New LowLevelKeyboardProc(AddressOf KeyboardHooking.HookCallback)
Private Const WH_KEYBOARD As Integer = 2
Private Const WH_KEYBOARD_LL As Integer = 13
Private Const WM_KEYDOWN As Integer = &H100

' Nested Types
Public Delegate Function LowLevelKeyboardProc(ByVal nCode As Integer, ByVal wParam As IntPtr, ByVal lParam As IntPtr) As Integer

End Class

Public Class BindingFunctions
' Methods
<DllImport("user32.dll")> _
Private Shared Function GetKeyState(ByVal nVirtKey As Integer) As Short
End Function

Public Shared Function IsKeyDown(ByVal keys As Keys) As Boolean
    Return ((BindingFunctions.GetKeyState(CInt(keys)) And &H8000) = &H8000)
End Function

End Class
导入系统
导入System.Runtime.CompilerServices
导入System.Runtime.InteropServices
导入System.Windows.Forms
朋友级键盘挂钩
"方法",
_
私有共享函数CallNextHookEx(ByVal hhk作为IntPtr,ByVal nCode作为Integer,ByVal wParam作为IntPtr,ByVal lParam作为IntPtr)作为IntPtr
端函数
_
私有共享函数GetModuleHandle(ByVal lpModuleName作为字符串)作为IntPtr
端函数
私有共享函数HookCallback(ByVal nCode作为整数,ByVal wParam作为IntPtr,ByVal lParam作为IntPtr)作为整数
如果((nCode>=0)和(nCode=0)),则
Dim keyData As Keys=DirectCast(CInt(wParam),Keys)
如果((BindingFunctions.IsKeyDown(Keys.ControlKey)和also BindingFunctions.IsKeyDown(Keys.ShiftKey))和also BindingFunctions.IsKeyDown(My.Settings.keyLinkQuickToDB)),那么
linkQuickToDB()
'数量转换器
ElseIf((BindingFunctions.IsKeyDown(key.ControlKey)和also BindingFunctions.IsKeyDown(key.ShiftKey))和also BindingFunctions.IsKeyDown(My.Settings.keyQtyChange))然后
qtyChanger()
如果结束
如果结束
Return CInt(KeyboardHooking.CallNextHookEx(KeyboardHooking.\u hookID,nCode,wParam,lParam))
端函数
公共共享子发布钩子()
键盘挂钩。解锁键盘挂钩(键盘挂钩。\u hookID)
端接头
公共共享子SetHook()
KeyboardHooking.\u hookID=KeyboardHooking.SetWindowsHookEx(2,KeyboardHooking.\u proc,IntPtr.Zero,Convert.ToUInt32(AppDomain.GetCurrentThreadId))
端接头
_
私有共享函数SetWindowsHookEx(ByVal idHook作为整数,ByVal lpfn作为低层Keyboardproc,ByVal hMod作为IntPtr,ByVal dwThreadId作为UInt32)作为IntPtr
端函数
_
私有共享函数UnhookWindowsHookEx(ByVal hhk作为IntPtr)作为布尔值
端函数
“田地
私有共享_hookID为IntPtr=IntPtr.Zero
私有共享_procas LowLevelKeyboardProc=新的LowLevelKeyboardProc(KeyboardHooking.HookCallback的地址)
专用常量WH_键盘为整数=2
私有常量WH\u键盘LL为整数=13
Private Const wmu KEYDOWN作为整数=&H100
'嵌套类型
公共委托函数LowLevelKeyboardProc(ByVal nCode为整数,ByVal wParam为IntPtr,ByVal lParam为IntPtr)为整数
末级
公共类绑定函数
"方法",
_
私有共享函数GetKeyState(ByVal nVirtKey为整数)为短
端函数
公共共享函数IsKeyDown(ByVal键作为键)为布尔值
返回((BindingFunctions.GetKeyState(CInt(keys))和&H8000)=&H8000)
端函数
末级

在回调函数中返回非零值

Private Shared Function HookCallback(ByVal nCode As Integer, ByVal wParam As IntPtr, ByVal lParam As IntPtr) As Integer
    If ((nCode >= 0) AndAlso (nCode = 0)) Then
        Dim keyData As Keys = DirectCast(CInt(wParam), Keys)

        If ((BindingFunctions.IsKeyDown(Keys.ControlKey) AndAlso BindingFunctions.IsKeyDown(Keys.ShiftKey)) AndAlso BindingFunctions.IsKeyDown(My.Settings.keyLinkQuickToDB)) Then
            linkQuickToDB()
            Return -1 'prevent passing

        'Qty Changer
        ElseIf ((BindingFunctions.IsKeyDown(Keys.ControlKey) AndAlso BindingFunctions.IsKeyDown(Keys.ShiftKey)) AndAlso BindingFunctions.IsKeyDown(My.Settings.keyQtyChange)) Then
            qtyChanger()
            Return -1 'prevent passing
        End If
    End If

    Return CInt(KeyboardHooking.CallNextHookEx(KeyboardHooking._hookID, nCode, wParam, lParam))    
End Function
更多细节