Advertisement
CorrM

Keyboard Hook VB.Net

Mar 25th, 2017
228
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
VB.NET 5.33 KB | None | 0 0
  1. '''
  2. ''' Who To Use
  3. '''
  4. Module Module1
  5.     Dim WithEvents kbHook As New KeyboardHook
  6.  
  7.     ' Some Useful Events
  8.     Private Sub kbHook_KeyDown(ByVal xKey As System.Windows.Forms.Keys) Handles kbHook.KeyDown
  9.         Console.WriteLine(xKey.ToString & " => KeyDown")
  10.     End Sub
  11.  
  12.     Private Sub kbHook_KeyUp(ByVal xKey As System.Windows.Forms.Keys) Handles kbHook.KeyUp
  13.         Console.WriteLine(xKey.ToString & " => KeyUp")
  14.     End Sub
  15.  
  16.     Sub Main()
  17.  
  18.         ' Change User Input
  19.         kbHook.ChangableChrs.Add(Keys.A, "1"c)
  20.         kbHook.ChangableChrs.Add(Keys.B, "2"c)
  21.  
  22.         ' Start Hook
  23.         kbHook.Start()
  24.         Dim msg As MSG
  25.         Dim ret As Integer
  26.         ret = GetMessage(msg, IntPtr.Zero, 0, 0)
  27.         While ret <> 0
  28.         End While
  29.     End Sub
  30.  
  31. End Module
  32. ''' ---------------------------------------
  33.  
  34. '''
  35. ''' KeyboardHook
  36. '''
  37. Imports System.Runtime.InteropServices
  38.  
  39. Public Class KeyboardHook
  40.  
  41.     Public ChangableChrs As New Dictionary(Of Keys, Char)
  42.  
  43.     Structure MSG
  44.         Dim hwnd As Long
  45.         Dim message As Long
  46.         Dim wParam As Long
  47.         Dim lParam As Long
  48.         Dim time As Long
  49.         Dim pt As Point
  50.     End Structure
  51.  
  52.     <DllImport("user32.dll")>
  53.     Public Shared Function DispatchMessage(ByRef lpmsg As MSG) As IntPtr
  54.     End Function
  55.  
  56.     <DllImport("user32.dll")>
  57.     Public Shared Function GetMessage(
  58.      ByRef lpMsg As MSG,
  59.      ByVal hWnd As IntPtr,
  60.      ByVal wMsgFilterMin As UInteger,
  61.      ByVal wMsgFilterMax As UInteger) As <MarshalAs(UnmanagedType.Bool)> Boolean
  62.     End Function
  63.     <DllImport("user32.dll")>
  64.     Public Shared Function TranslateMessage(ByRef lpMsg As MSG) As <MarshalAs(UnmanagedType.Bool)> Boolean
  65.     End Function
  66.  
  67.     <DllImport("kernel32.dll", CharSet:=CharSet.Auto)> _
  68.     Public Shared Function GetModuleHandle(ByVal lpModuleName As String) As IntPtr
  69.     End Function
  70.  
  71.     <DllImport("kernel32.dll")> _
  72.     Public Shared Function GetCurrentThreadId() As UInteger
  73.     End Function
  74.  
  75.     <DllImport("User32.dll", CharSet:=CharSet.Auto, CallingConvention:=CallingConvention.StdCall)>
  76.     Private Overloads Shared Function SetWindowsHookEx(ByVal idHook As Integer, ByVal HookProc As KBDLLHookProc, ByVal hInstance As IntPtr, ByVal wParam As Integer) As Integer
  77.     End Function
  78.     <DllImport("User32.dll", CharSet:=CharSet.Auto, CallingConvention:=CallingConvention.StdCall)>
  79.     Private Overloads Shared Function CallNextHookEx(ByVal idHook As Integer, ByVal nCode As Integer, ByVal wParam As IntPtr, ByVal lParam As IntPtr) As Integer
  80.     End Function
  81.     <DllImport("User32.dll", CharSet:=CharSet.Auto, CallingConvention:=CallingConvention.StdCall)>
  82.     Private Overloads Shared Function UnhookWindowsHookEx(ByVal idHook As Integer) As Boolean
  83.     End Function
  84.  
  85.     <StructLayout(LayoutKind.Sequential)>
  86.     Private Structure KBDLLHOOKSTRUCT
  87.         Public vkCode As UInt32
  88.         Public scanCode As UInt32
  89.         Public flags As KBDLLHOOKSTRUCTFlags
  90.         Public time As UInt32
  91.         Public dwExtraInfo As UIntPtr
  92.     End Structure
  93.  
  94.     <Flags()>
  95.     Private Enum KBDLLHOOKSTRUCTFlags As UInt32
  96.         LLKHF_EXTENDED = &H1
  97.         LLKHF_INJECTED = &H10
  98.         LLKHF_ALTDOWN = &H20
  99.         LLKHF_UP = &H80
  100.     End Enum
  101.  
  102.  
  103.     Public Shared Event KeyDown(ByVal Key As Keys)
  104.     Public Shared Event KeyUp(ByVal Key As Keys)
  105.  
  106.     Private Const WH_KEYBOARD_LL As Integer = 13
  107.     Private Const HC_ACTION As Integer = 0
  108.     Private Const WM_KEYDOWN = &H100
  109.     Private Const WM_KEYUP = &H101
  110.     Private Const WM_SYSKEYDOWN = &H104
  111.     Private Const WM_SYSKEYUP = &H105
  112.  
  113.     Private Delegate Function KBDLLHookProc(ByVal nCode As Integer, ByVal wParam As IntPtr, ByVal lParam As IntPtr) As Integer
  114.  
  115.     Private KBDLLHookProcDelegate As KBDLLHookProc = New KBDLLHookProc(AddressOf KeyboardProc)
  116.     Private HHookID As IntPtr = IntPtr.Zero
  117.  
  118.     Private Function KeyboardProc(ByVal nCode As Integer, ByVal wParam As IntPtr, ByVal lParam As IntPtr) As Integer
  119.         If (nCode = HC_ACTION) Then
  120.             Dim struct As KBDLLHOOKSTRUCT
  121.             Select Case wParam
  122.                 Case WM_KEYDOWN, WM_SYSKEYDOWN
  123.                     struct = CType(Marshal.PtrToStructure(lParam, struct.GetType()), KBDLLHOOKSTRUCT)
  124.  
  125.                     Dim xKey As Keys = struct.vkCode
  126.                     RaiseEvent KeyDown(xKey)
  127.  
  128.                     If ChangableChrs.ContainsKey(xKey) Then
  129.                         SendKeys.SendWait(ChangableChrs.Item(xKey))
  130.                         Return 1
  131.                     End If
  132.  
  133.                 Case WM_KEYUP, WM_SYSKEYUP
  134.                     Dim xKey As Keys = CType(Marshal.PtrToStructure(lParam, struct.GetType()), KBDLLHOOKSTRUCT).vkCode
  135.                     RaiseEvent KeyUp(xKey)
  136.             End Select
  137.         End If
  138.  
  139.         Return CallNextHookEx(IntPtr.Zero, nCode, wParam, lParam)
  140.     End Function
  141.  
  142.     Public Sub Start()
  143.         HHookID = SetWindowsHookEx(WH_KEYBOARD_LL, KBDLLHookProcDelegate, GetModuleHandle(Process.GetCurrentProcess().MainModule.ModuleName), 0)
  144.         If HHookID = IntPtr.Zero Then
  145.             Throw New Exception("Could not set keyboard hook")
  146.         End If
  147.     End Sub
  148.  
  149.     Protected Overrides Sub Finalize()
  150.         If Not HHookID = IntPtr.Zero Then
  151.             UnhookWindowsHookEx(HHookID)
  152.         End If
  153.         MyBase.Finalize()
  154.     End Sub
  155.  
  156. End Class
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement