Эмуляция нажатия клавиш в приложении под управлением DirectX - Visual Basic .NET
Формулировка задачи:
Доброго времени.
Перелопатил кучу инфы, и слегка запутался.
Задача - клацнуть клавишей в приложении под управлением DirectX
Простой короткий код, половина которого работает, половина нет:
Почитал вот эти источники (и еще кучу других):Имитация нажатия клавиши Tab в стороннем приложении (игре)http://visualbasic.happycodings.com/api-and-miscellaneous/code38.html[ссылка на форум]
Пришел к выводу, что надо получить скэн-код клавиши Q в переменную, скажем, lScan. и поставить во вторую позицию в функцию keybd_event:
И все, на этом встрял. MapVirtualKey(VK_Q, 0) - это неправильный код, туда надо передавать вместo VK_Q какой-то код клавиши wCode типа long, а где его взять - хз, и что это вообще такое?
Можете мне объяснить, где взять нужный код для клавиши (не byte а long)? Или я вообще не в ту степь залез? и почему эмуляция мышки работает, а аналогичная эмуляция клавиатуры - нет?
Во второй приведенной мной ссылке есть метод получения этого кода клавиши, но я его не понимаю, у меня он вообще не работает (VS2010 Ultimate):
У меня подчеркивает cChar (ключевое слово не может использоваться в качестве идентификатора)
Вобщем, помогите, пожалуйста, разобраться в каше в моей голове.
Листинг программы
- Public Class Form1
- Declare Auto Function FindWindow Lib "USER32.DLL" (ByVal lpClassName As String, ByVal lpWindowName As String) As IntPtr
- Declare Auto Function SetForegroundWindow Lib "USER32.DLL" (ByVal hWnd As IntPtr) As Boolean
- Private Declare Function MapVirtualKey Lib "user32" Alias "MapVirtualKeyA" (ByVal wCode As Long, ByVal wMapType As Long) As Long
- Private Declare Sub mouse_event Lib "user32" (ByVal dwFlags As Integer, ByVal dx As Integer, ByVal dy As Integer, ByVal cButtons As Integer, ByVal dwExtraInfo As Integer)
- Private Declare Sub keybd_event Lib "user32" (ByVal bVk As Byte, ByVal bScan As Byte, ByVal dwFlags As Integer, ByVal dwExtraInfo As Integer)
- Private Const MOUSEEVENTF_LEFTDOWN = &H2
- Private Const MOUSEEVENTF_LEFTUP = &H4
- Private Const KEYEVENTF_KEYUP = &H2 'событие отпускания клавиши
- Private Const KEYEVENTF_EXTENDEDKEY = &H1
- Private Const VK_Q = &H51 'клавиша q
- Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
- 'Переключаемся а окно нашей программы, работает
- ProgHandle = FindWindow(vbNullString, "Dx_program")
- If ProgHandle = IntPtr.Zero Then
- MsgBox("Программа не найдена")
- End_work() 'в конце дописан метод завершения программы, не буду тут приводить
- End If
- SetForegroundWindow(ProgHandle)
- threading.thread.sleep(1000)
- ' клацаем мышкой - РАБОТАЕТ
- mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 3, 3)
- Thread.Sleep(50)
- mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 3, 3)
- ' Жмем Q - НЕ РАБОТАЕТ
- keybd_event(VK_Q, 0, KEYEVENTF_EXTENDEDKEY, 0)
- Thread.Sleep(50)
- keybd_event(VK_Q, 0, KEYEVENTF_KEYUP, 0)
- End sub
- End class
Листинг программы
- Dim lScan As Long
- lScan = MapVirtualKey(VK_Q, 0)
- keybd_event(VK_Q, lScan, KEYEVENTF_EXTENDEDKEY, 0)
Листинг программы
- Private Declare Function VkKeyScan Lib "user32" Alias "VkKeyScanA" (ByVal cChar As Byte) As Long
- ...
- lVK = VkKeyScan(Asc(sKey))
Решение задачи: «Эмуляция нажатия клавиш в приложении под управлением DirectX»
textual
Листинг программы
- keybd_event(VK_Q, VK_Q_SCAN, 0, 0) 'нажимаем клавишу Q
- Thread.Sleep(50)' ждем 50 мс
- keybd_event(VK_Q, VK_Q_SCAN, KEYEVENTF_KEYUP, 0) ' отпускаем клавишу Q
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д