Вы можете использовать мою библиотеку под названием InputHelper .Он был создан, чтобы помочь .NET-разработчикам как простым, так и правильным способом получать и моделировать ввод с помощью мыши и клавиатуры.
После слишком большого количества вопросов о переполнении стека и ответов на них, когда пользователь использовал устаревший API илитам, где их подписи P / Invoke, где-то далеко, я решил создать его как более дружественный к .NET способ управления вводом, а также как попытку бороться с единственным частично правильным кодом, который пользователи собирали из разных мест в Интернете.
InputHelper построен на основе собственного API-интерфейса Windows (WinAPI) и использует такие функции, как SendInput()
, SendMessage()
/ PostMessage()
и SetWindowsHookEx()
, чтобы выполнить свою работу.
Его Wiki , к сожалению, еще далеко не завершен, так как я только задокументировал хуки мыши и клавиатуры,тем не менее, библиотека содержит XML-файлы документации, содержащие комментарии, поясняющие каждую функцию в ней, которые автоматически отображаются IntelliSense при вводе вашей команды.де.Поэтому для мини-документации и обзора библиотеки вы всегда можете открыть обозреватель объектов Visual Studio (нажмите F12 для любого типа или пространства имен или перейдите к View > Object Browser
) и найдите его там.
InputHelper в настоящее время состоит из четырех частей:
InputHelper.Hooks
: классы для ввода общесистемного ввода мыши и клавиатуры.Это можно использовать, например, для создания горячих клавиш.
InputHelper.Keyboard
: методы для имитации физического ("реального") ввода с клавиатуры / нажатия клавиш.
InputHelper.Mouse
: методы имитации ввода физической мышью.
InputHelper.WindowMessages
:Методы имитации ввода с клавиатуры и мыши на более виртуальном уровне.Он использует оконные сообщения (Send-/PostMessage
) и может использоваться для нацеливания на определенные окна.
Требуемое значение - InputHelper.Hooks
, в частности InputHelper.Hooks.MouseHook
.
Для начала загрузите скомпилированную версию библиотеки на странице Releases и добавьте ее в качестве ссылки на ваш проект.Для удобства импортируйте пространство имен InputHelperLib
в файл (ы), которым вы будете его использовать:
Imports InputHelperLib
Теперь самый простой способ создать зацепку для мыши - просто создать экземпляр экземпляра MouseHook
класс на уровне класса:
Dim MouseHook As New InputHelper.Hooks.MouseHook
Это будет прослушивать события мыши, пока переменная не выйдет из области видимости или пока вы не вызовете Dispose()
для нее.
Если вы неЕсли вы хотите сразу запустить ловушку, просто объявите переменную и инициализируйте ее в любое время.
Dim MouseHook As InputHelper.Hooks.MouseHook
'Start the hook at the click of a button.
Private Sub StartButton_Click(sender As Object, e As EventArgs) Handles StartButton.Click
If MouseHook Is Nothing Then
MouseHook = New InputHelper.Hooks.MouseHook
End If
End Sub
В ловушку входят четыре события:
MouseDown
- Происходит при нажатии или удерживании кнопки мыши.
MouseMove
- Происходит при движении мыши.
MouseUp
-Происходит при отпускании кнопки мыши.
MouseWheel
- Происходит при прокрутке колесика мыши.
Вы можете подписаться на событияиспользуя оператор AddHandler
.
Dim MouseHook As InputHelper.Hooks.MouseHook
'Start the hook at the click of a button.
Private Sub StartButton_Click(sender As Object, e As EventArgs) Handles StartButton.Click
If MouseHook Is Nothing Then
MouseHook = New InputHelper.Hooks.MouseHook
AddHandler MouseHook.MouseDown, AddressOf MouseHook_MouseDown
AddHandler MouseHook.MouseMove, AddressOf MouseHook_MouseMove
AddHandler MouseHook.MouseWheel, AddressOf MouseHook_MouseWheel
End If
End Sub
Пример MouseDown
Обработчик события:
Private Sub MouseHook_MouseDown(sender As Object, e As InputHelperLib.InputHelper.Hooks.MouseHookEventArgs)
If e.Button = System.Windows.Forms.MouseButtons.Left AndAlso e.DoubleClick = True Then
MessageBox.Show("Left mouse button was double-clicked.")
End If
End Sub
Пример MouseMove
обработчик событий:
Private Sub MouseHook_MouseMove(sender As Object, e As InputHelperLib.InputHelper.Hooks.MouseHookEventArgs)
LogTextBox.AppendText("Mouse moved to (X: " & e.Location.X & ", Y: " & e.Location.Y & ")")
End Sub
Пример MouseWheel
обработчик событий :
Private Sub MouseHook_MouseWheel(sender As Object, e As InputHelperLib.InputHelper.Hooks.MouseHookEventArgs)
If e.Delta > 0 AndAlso e.ScrollDirection = InputHelper.Hooks.ScrollDirection.Vertical Then
MessageBox.Show("Mouse scrolled up")
End If
End Sub
И теперь у вас есть работающий глобальный хук мыши!
Для получения более подробной информации о хуке и его аргументах событий, пожалуйста, взгляните на вики проекта .
Бонусный вопрос: работает ли ваше решение, когда«событие» перемещения / щелчка мыши было вызвано другим программным обеспечением, а не человеком, который фактически управляет мышью.
Да и нет.Это зависит от того, как другое программное обеспечение вызвало событие.Если он использует SendInput
или подобное для имитации фактического, физического ввода, тогда да.Если он использует оконные сообщения для определения конкретных окон, то нет.