Как зарегистрироваться на глобальные события мыши (переместить, щелкнуть) с помощью VB.NET? - PullRequest
1 голос
/ 13 марта 2019

Для моей собственной реализации облегченного приложения удаленного обслуживания (такого как RDP, TeamViewer) мне нужно прослушивать системные (или глобальные) события мыши, такие как перемещение мыши или щелчок влево / вправо / в середину / и т. Д.

Я обнаружил, что существует управляемый интерфейс / API для запроса позиции мыши в системе:

Dim pos As System.Drawing.Point = Windows.Forms.Cursor.Position
Label1.Text = String.Format("Current Position: {0} - {1}", pos.X, pos.Y)

Однако у класса Windows.Forms.Cursor, похоже, нет событий, я могу зарегистрироваться / прослушать,Private WithEvents MyCurser As Windows.Forms.Cursor не имеет никакого списка с Handles.

Чтобы было более понятно: я хочу отслеживать события мыши за пределами моего приложения (поэтому выберите прослушиватели событий в моих собственных формахне применимы), так как мое приложение является приложением удаленной службы, таким как RDP или TeamViewer, которое только перенаправляет события мыши (и дисплей) на удаленный компьютер.

Есть ли управляемый (.NET) способ получения положения мыши изменяется как событие (и не требует наличия таймера для запроса положения), а также, нажал ли пользователь (щелкает) кнопку мыши (и что это за кнопка)?

Дополнительный вопрос: работает ли ваше решение, когда "событие" перемещения / щелчка мыши было инициировано другим программным обеспечением, а не человеком, который фактически управляет мышью.

1 Ответ

0 голосов
/ 13 марта 2019

Вы можете использовать мою библиотеку под названием 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 или подобное для имитации фактического, физического ввода, тогда да.Если он использует оконные сообщения для определения конкретных окон, то нет.

...