VB Имитировать нажатия клавиш через user32

Я хочу имитировать нажатия клавиш, как я делал с щелчками мыши, и мне удалось найти пример кода в Интернете.

Декларация

Public Const MOUSEEVENTF_LEFTDOWN = &H2
Public Const MOUSEEVENTF_LEFTUP = &H4

Declare Function apimouse_event Lib "user32.dll" Alias "mouse_event" (ByVal dwFlags As Int32, ByVal dX As Int32, ByVal dY As Int32, ByVal cButtons As Int32, ByVal dwExtraInfo As Int32) As Boolean

Моделирование щелчков мышью

Call apimouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0)
Call apimouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0)

Приведенный выше код может имитировать щелчки мыши даже в приложении DirectX. Есть ли аналогичный способ имитации нажатия клавиш? Также было бы здорово, если бы вы могли объяснить, что делает приведенный выше код, поскольку я его не совсем понимаю.


person Perplex    schedule 09.06.2015    source источник
comment
Перейдите на codeproject.com и найдите Global Mouse and Keyboard Library. Первым хитом должен стать проект Брайана Геймана. Этот проект реализует необходимые API-интерфейсы мыши и клавиатуры и имеет простой демонстрационный проект, который записывает и воспроизводит события мыши и клавиатуры.   -  person Chris Dunaway    schedule 09.06.2015
comment
Насколько я понимаю синтаксис C#, мне трудно внедрить тот же код в мой проект VB.net. Также я ищу более простую альтернативу вместо создания нескольких классов только для этой функциональности.   -  person Perplex    schedule 09.06.2015


Ответы (1)


Естественно, вместо использования сообщений «события мыши» вы должны использовать «события клавиатуры». Взгляните на страницу keybd_event на сайте pinvoke.net, где есть несколько примеров.

Имейте в виду, что они буквально эмулируют нажатия пользователем клавиш на клавиатуре, поэтому они всегда отправляются на элемент управления с фокусом («передний план»). Если вам нужно отправить определенные нажатия клавиш в скрытые или фоновые окна, то вы ищете SendMessage.

person Justin Ryan    schedule 09.06.2015
comment
Спасибо, у меня это работает в блокноте, но не в DirectX. Может быть, это что-то другое, что я ищу - person Perplex; 09.06.2015
comment
Не зная подробностей о приложении или вашем проекте, я предполагаю, что приложение DirectX не имеет фокуса или теряет фокус в какой-то момент. Функции SendMessage, которые я упомянул, позволяют вам нацеливаться на определенные циклы сообщений с помощью дескриптора окна, поэтому вы гарантированно отправляете сообщения правильной цели. SendMessage несколько сложнее в использовании, но существуют значительные примеры. - person Justin Ryan; 09.06.2015