Перехват событий мыши и клавиатуры в VB6
Запись от The trick размещена 23.01.2014 в 10:59
Показов 18297
Комментарии 7
Метки vb
|
Простой модуль для перехвата событий мыши и клавиатуры. События перехватываются в независимости от активности данного приложения (можно перехватывать в чужих окнах). Используются LowLevel хуки, также простой сменой LL -хука на обычный (без LL) можно перехватывать только в своем приложении. Также распознаеться программное нажатие через keybd_events, mouse_events от реального (насчет SendInput и SendKeys не проверял). Модуль:
| ||||||||||
Метки vb
Размещено в Без категории
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Всего комментариев 7
Комментарии
-
Большое спасибо, очень помоглоЗапись от brifing размещена 28.01.2014 в 22:08
-
Запись от Bati4eli размещена 21.05.2015 в 09:41
-
Да можно. Подключаешься к очереди ввода нужного потока, получашь раскладку и далее с помощью ToAsciiEx получаешь символ.
Сообщение от Bati4eli
Запись от The trick размещена 11.07.2015 в 00:20
-
Привет. Я немного исследовал твоё решение. Целью было узнать, каким образом запретить некоторые события при условии, что мышь имитируется. Например, имитацию(inj) видно если другая программа создаёт mouse_event. А также видно, если пользоваться компьютером через TeamViewer - там все действия с (inj). Я добавил на форму кнопку, чтобы _Click обрабатывалось только при нажатии мышью, а не от mouse_event. Такой способ работает и кнопка не нажимается от эмуляции.
В модуль я добавил такие строки:
В объявление:
В функцию LowLevelMouseProc я добавил условие:Visual Basic 1
Public Emul As Boolean
На саму форму поставил кнопку:Visual Basic 1 2 3 4 5
If (lParam.flags And LLMHF_INJECTED) = 1 Then Emul = True Else Emul = False End If
Потом встал вопрос. Как сделать так, чтобы не только кнопка не работала, а мышь не двигалась на запрещённом приложении, если MouseMove порождается эмуляцией? Ну, например, как в одном из антивирусников. Из TeamViewer им нельзя управлять, т.к. курсор просто не входит в окно программы. Я поначалу подумал в сторону GetClipCursor. Но вряд ли это подходящий вариант. Вариант с SetCursorPos при достижении границ окна тоже не очень. Курсор будет дрожать при множественных попытках переместиться к границе окна.Visual Basic 1 2 3
Private Sub Command1_Click() If Not Emul Then MsgBox "НЕ эмулятор" End Sub
Не подскажешь, какие ещё варианты можно обдумать?Запись от CharlyChaplin размещена 08.09.2017 в 12:05
-
Добрый день!
Расширил ваш код под 64bit Excel, но происходит экстренное завершение Excel при выставлении brek point на функции LowLevelkbdProc, можете помочь разобраться в чем причина ?
Код:
Visual Basic 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64
Option Explicit ' Модуль для перехвата событий ввода мыши и клавиатуры ' © Кривоус Анатолий Анатольевич (The trick), 2014 Private Type KBDLLHOOKSTRUCT VkCode As Long ScanCode As Long flags As Long time As Long dwExtraInfo As Long End Type #If Win64 Then Private Declare PtrSafe Function SetWindowsHookEx Lib "user32" Alias "SetWindowsHookExA" (ByVal idHook As LongPtr, ByVal lpfn As LongPtr, ByVal hmod As LongPtr, ByVal dwThreadId As LongPtr) As LongPtr Private Declare PtrSafe Function CallNextHookEx Lib "user32" (ByVal hHook As LongPtr, ByVal ncode As LongPtr, ByVal wParam As Integer, lParam As Any) As LongPtr Private Declare PtrSafe Function UnhookWindowsHookEx Lib "user32" (ByVal hHook As LongPtr) As LongPtr #Else Private 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 Private Declare Function CallNextHookEx Lib "user32" (ByVal hHook As Long, ByVal ncode As Long, ByVal wParam As Integer, lParam As Any) As Long Private Declare Function UnhookWindowsHookEx Lib "user32" (ByVal hHook As Long) As Long #End If Private Const WH_KEYBOARD_LL = 13 Private Const HC_ACTION = 0 Private Const LLKHF_INJECTED = &H10 Private Const WM_KEYDOWN As Long = &H100 Private Const WM_KEYUP As Long = &H101 Private Const WM_SYSKEYDOWN As Long = &H104 Private Const WM_SYSKEYUP As Long = &H105 Dim mhWndVBE As LongPtr Dim hKeyHook As LongPtr, hMouseHook As LongPtr Public Sub Hook() hKeyHook = SetWindowsHookEx(WH_KEYBOARD_LL, AddressOf LowLevelkbdProc, Application.HinstancePtr, 0) If hKeyHook = 0 Then MsgBox ("Keyboard hook error") End Sub Public Sub UnHook() If hKeyHook Then UnhookWindowsHookEx (hKeyHook): hKeyHook = 0 End Sub ' Процедура перехвата сообщений клавиатуры Private Function LowLevelkbdProc(ByVal uCode As LongPtr, ByVal wParam As Long, lParam As KBDLLHOOKSTRUCT) As LongPtr If uCode = HC_ACTION Then Select Case wParam Case WM_KEYDOWN, WM_KEYUP, WM_SYSKEYDOWN, WM_SYSKEYUP Debug.Print KeyString(wParam) & _ "KeyCode: " & lParam.VkCode & _ " ScanCode: " & lParam.ScanCode & _ IIf(lParam.flags And LLKHF_INJECTED, "(inj)", vbNullString) End Select End If LowLevelkbdProc = CallNextHookEx(hKeyHook, uCode, wParam, lParam) End Function Private Function KeyString(WH As Long) As String Select Case WH Case WM_KEYDOWN: KeyString = "KeyDown:" Case WM_KEYUP: KeyString = "KeyUp:" Case WM_SYSKEYDOWN: KeyString = "KeySysDown:" Case WM_SYSKEYUP: KeyString = "KeySysUp:" End Select End Function
Запись от art1289 размещена 07.08.2019 в 09:22
-
Доброго времени суток
Столкнулся с бедой не могу получить Хэндд и соответсвенно содержимое дочернего окна в Windows 10 используя приведенный код. Такое ощущение что выводится картинка - по любому месту кликаешь опредеяется только хэндл родительского окна.
Исследуемое ПО одно и тоже но на разных системах. В XP находит в 10 нетЗапись от Newzero размещена 03.09.2020 в 21:14
-
Запись от Argus19 размещена 05.12.2024 в 10:39



