Эмуляция нажатия клавиш в приложении под управлением DirectX - Visual Basic .NET

Узнай цену своей работы

Формулировка задачи:

Доброго времени. Перелопатил кучу инфы, и слегка запутался. Задача - клацнуть клавишей в приложении под управлением DirectX Простой короткий код, половина которого работает, половина нет:
Листинг программы
  1. Public Class Form1
  2. Declare Auto Function FindWindow Lib "USER32.DLL" (ByVal lpClassName As String, ByVal lpWindowName As String) As IntPtr
  3. Declare Auto Function SetForegroundWindow Lib "USER32.DLL" (ByVal hWnd As IntPtr) As Boolean
  4. Private Declare Function MapVirtualKey Lib "user32" Alias "MapVirtualKeyA" (ByVal wCode As Long, ByVal wMapType As Long) As Long
  5. 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)
  6. Private Declare Sub keybd_event Lib "user32" (ByVal bVk As Byte, ByVal bScan As Byte, ByVal dwFlags As Integer, ByVal dwExtraInfo As Integer)
  7.  
  8. Private Const MOUSEEVENTF_LEFTDOWN = &H2
  9. Private Const MOUSEEVENTF_LEFTUP = &H4
  10. Private Const KEYEVENTF_KEYUP = &H2 'событие отпускания клавиши
  11. Private Const KEYEVENTF_EXTENDEDKEY = &H1
  12. Private Const VK_Q = &H51 'клавиша q
  13.  
  14. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
  15. 'Переключаемся а окно нашей программы, работает
  16. ProgHandle = FindWindow(vbNullString, "Dx_program")
  17. If ProgHandle = IntPtr.Zero Then
  18. MsgBox("Программа не найдена")
  19. End_work() 'в конце дописан метод завершения программы, не буду тут приводить
  20. End If
  21. SetForegroundWindow(ProgHandle)
  22. threading.thread.sleep(1000)
  23. ' клацаем мышкой - РАБОТАЕТ
  24. mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 3, 3)
  25. Thread.Sleep(50)
  26. mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 3, 3)
  27. ' Жмем Q - НЕ РАБОТАЕТ
  28. keybd_event(VK_Q, 0, KEYEVENTF_EXTENDEDKEY, 0)
  29. Thread.Sleep(50)
  30. keybd_event(VK_Q, 0, KEYEVENTF_KEYUP, 0)
  31. End sub
  32. End class
Почитал вот эти источники (и еще кучу других):Имитация нажатия клавиши Tab в стороннем приложении (игре)http://visualbasic.happycodings.com/api-and-miscellaneous/code38.html[ссылка на форум] Пришел к выводу, что надо получить скэн-код клавиши Q в переменную, скажем, lScan. и поставить во вторую позицию в функцию keybd_event:
Листинг программы
  1. Dim lScan As Long
  2. lScan = MapVirtualKey(VK_Q, 0)
  3. keybd_event(VK_Q, lScan, KEYEVENTF_EXTENDEDKEY, 0)
И все, на этом встрял. MapVirtualKey(VK_Q, 0) - это неправильный код, туда надо передавать вместo VK_Q какой-то код клавиши wCode типа long, а где его взять - хз, и что это вообще такое? Можете мне объяснить, где взять нужный код для клавиши (не byte а long)? Или я вообще не в ту степь залез? и почему эмуляция мышки работает, а аналогичная эмуляция клавиатуры - нет? Во второй приведенной мной ссылке есть метод получения этого кода клавиши, но я его не понимаю, у меня он вообще не работает (VS2010 Ultimate):
Листинг программы
  1. Private Declare Function VkKeyScan Lib "user32" Alias "VkKeyScanA" (ByVal cChar As Byte) As Long
  2. ...
  3. lVK = VkKeyScan(Asc(sKey))
У меня подчеркивает cChar (ключевое слово не может использоваться в качестве идентификатора) Вобщем, помогите, пожалуйста, разобраться в каше в моей голове.

Решение задачи: «Эмуляция нажатия клавиш в приложении под управлением DirectX»

textual
Листинг программы
  1.                 keybd_event(VK_Q, VK_Q_SCAN, 0, 0) 'нажимаем клавишу Q
  2.                 Thread.Sleep(50)' ждем 50 мс
  3.                 keybd_event(VK_Q, VK_Q_SCAN, KEYEVENTF_KEYUP, 0) ' отпускаем клавишу Q

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

5   голосов , оценка 4.2 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы