Winand

keyboard/mouse hook

Aug 19th, 2012
206
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. Option Explicit
  2. Private Declare Function PostMessage Lib "user32.dll" Alias "PostMessageA" (ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
  3. Private Const WM_COPYDATA As Long = &H4A
  4. Private Const WM_USER As Long = &H400
  5. Private Const WM_WHEEL As Long = (WM_USER + 1)
  6. Private Const WM_KEYS As Long = (WM_USER + 2)
  7. Private Const WM_REGHOOK As Long = (WM_USER + 3)
  8. Private Const WM_UNREGHOOK As Long = WM_REGHOOK
  9. Private Const WM_RESTART As Long = (WM_USER + 4)
  10.  
  11. Private Declare Function FindWindow Lib "user32.dll" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
  12. Private Const WINDOW_NAME As String = "Audica_Dummy"
  13. Private Const HOOK_NAME As String = "HookTool_Dummy"
  14. Private Declare Function DefWindowProc Lib "user32.dll" Alias "DefWindowProcA" (ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
  15. Private Declare Function SetWindowLong Lib "user32.dll" Alias "SetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
  16. Private Const GWL_WNDPROC As Long = -4
  17. Private Declare Function CreateWindowEx Lib "user32.dll" Alias "CreateWindowExA" (ByVal dwExStyle As Long, ByVal lpClassName As String, ByVal lpWindowName As String, ByVal dwStyle As Long, ByVal x As Long, ByVal y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal hWndParent As Long, ByVal hmenu As Long, ByVal hInstance As Long, ByRef lpParam As Any) As Long
  18. Private Declare Function DestroyWindow Lib "user32.dll" (ByVal hWnd As Long) As Long
  19. Private wnd As Long, dummy As Long
  20.  
  21. Private Declare Sub CopyMemory Lib "kernel32.dll" Alias "RtlMoveMemory" (ByRef Destination As Any, ByRef Source As Any, ByVal Length As Long)
  22. Public Declare Function SetWindowsHookEx Lib "USER32" Alias "SetWindowsHookExA" (ByVal idHook As Long, ByVal lpfn As Long, ByVal hmod As Long, ByVal dwThreadId As Long) As Long
  23. Public Declare Function UnhookWindowsHookEx Lib "USER32" (ByVal hHook As Long) As Long
  24. Private Declare Function CallNextHookEx Lib "USER32" (ByVal hHook As Long, ByVal nCode As Long, ByVal wParam As Long, lParam As Any) As Long
  25. Private Const HC_ACTION = 0
  26. Private Const WM_KEYDOWN = &H100
  27. Private Const WM_KEYUP = &H101
  28. Private Const WM_SYSKEYDOWN = &H104
  29. Private Const WM_SYSKEYUP = &H105
  30. Private Const WH_KEYBOARD_LL = 13
  31. Private Const WM_MOUSEWHEEL = &H20A
  32. Private Const WH_MOUSE_LL As Long = 14
  33. Private Type KBDLLHOOKSTRUCT
  34.     vkCode As Long
  35.     scanCode As Long
  36.     Flags As Long
  37.     time As Long
  38.     dwExtraInfo As Long
  39. End Type
  40. Private p As KBDLLHOOKSTRUCT
  41. Private mou_rotat As Integer
  42. Private kbd_hook_hndl As Long
  43. Private mou_hook_hndl As Long
  44. Public kbd_keys As New Collection 'Коллекция нажатых клавиш
  45.  
  46. Public Sub hook()
  47.     kbd_hook_hndl = _
  48.         SetWindowsHookEx(WH_KEYBOARD_LL, AddressOf km_hook_proc, App.hInstance, 0)
  49.     mou_hook_hndl = _
  50.         SetWindowsHookEx(WH_MOUSE_LL, AddressOf km_hook_proc, App.hInstance, 0)
  51. End Sub
  52.  
  53. Public Sub unhook()
  54.     If kbd_hook_hndl <> 0 Then _
  55.         UnhookWindowsHookEx kbd_hook_hndl
  56.     kbd_hook_hndl = 0
  57.     If mou_hook_hndl <> 0 Then _
  58.         UnhookWindowsHookEx mou_hook_hndl
  59.     mou_hook_hndl = 0
  60. End Sub
  61.  
  62. Public Function km_hook_proc(ByVal nCode As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
  63.     If nCode = HC_ACTION Then
  64.         Select Case wParam
  65.         Case WM_MOUSEWHEEL
  66.             CopyMemory mou_rotat, ByVal lParam + 10, 2
  67.             PostMessage wnd, WM_WHEEL, App.hInstance, CLng(Sgn(mou_rotat))
  68.         Case WM_KEYDOWN, WM_SYSKEYDOWN
  69.             CopyMemory p, ByVal lParam, Len(p)
  70.             If valByKey(p.vkCode) = -1 Then
  71.                 kbd_keys.Add p.vkCode, CStr(p.vkCode)
  72.                 If kbd_keys.Count = 1 Then _
  73.                     PostMessage wnd, WM_KEYS, App.hInstance, 1
  74.             End If
  75.         Case WM_KEYUP, WM_SYSKEYUP
  76.             CopyMemory p, ByVal lParam, Len(p)
  77.             If valByKey(p.vkCode) <> -1 Then _
  78.                 kbd_keys.Remove CStr(p.vkCode)
  79.             If kbd_keys.Count = 0 Then _
  80.                 PostMessage wnd, WM_KEYS, App.hInstance, -1
  81.         End Select
  82.     End If
  83.     km_hook_proc = CallNextHookEx(0, nCode, wParam, ByVal lParam)
  84. End Function
  85.  
  86. Private Function valByKey(ByVal key As String) As Long
  87. On Error GoTo 1:
  88.     valByKey = kbd_keys.Item(key)
  89. Exit Function
  90. 1:  valByKey = -1
  91. End Function
  92.  
  93. Private Function int_WindowProc(ByVal hWnd As Long, ByVal uMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
  94.     If uMsg = WM_UNREGHOOK Then Unload Form1
  95.     int_WindowProc = DefWindowProc(hWnd, uMsg, wParam, lParam)
  96. End Function
  97.  
  98. 'Найти сервер, создать дамми-окно, зарегистрировать его на сервере
  99. Public Function findServer() As Boolean
  100.     Dim prev As Long
  101.     If b(prev, FindWindow(vbNullString, HOOK_NAME)) Then _
  102.         PostMessage prev, WM_UNREGHOOK, 0, 0    'Выключить запущенный hooktool
  103.    If b(wnd, FindWindow(vbNullString, WINDOW_NAME)) Then
  104.         If dummy = 0 Then
  105.             dummy = CreateWindowEx(0, "STATIC", HOOK_NAME, 0, 0, 0, 0, 0, 0, 0, 0, ByVal 0)
  106.             SetWindowLong dummy, GWL_WNDPROC, AddressOf int_WindowProc
  107.         End If
  108.         PostMessage wnd, WM_REGHOOK, App.hInstance, dummy
  109.         findServer = True
  110.     End If
  111. End Function
  112.  
  113. Public Sub destroyDummy()
  114.     If dummy Then _
  115.         DestroyWindow dummy
  116. End Sub
  117.  
  118. Private Function b(p1 As Long, p2 As Long) As Boolean
  119.     p1 = p2
  120.     b = CBool(p1)
  121. End Function
Advertisement
Add Comment
Please, Sign In to add comment