Эмуляция нажатия клавиш в стороннем приложении - VB

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

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

Добрый день. Есть тестовое приложение, оно содержит один элемент меню, на котором висит shortcut(Ctrl+L) и командную кнопку. Если я нажимаю комбинацию клавиш Ctrl+L с клавиатуры, то появляется окно сообщения, что нажат пункт меню. Как сделать так, чтобы при нажатии на командную кнопку эмулировалось нажатие Ctrl+L для меню. Эту задачу удается решить с помощью keybd_event, но необходимо в дальнейшем отправлять комбинацию в функцию окна, использую хэндл окна. Соответственно keybd_event по этой причине не подходит, как не подходит и отправка сообщения wm_command. По идее, должен работать вариант с отправкой сообщений wm_keydown для каждой клавиши. Например: PostMessage хэндл окна, номер сообщения, vkkeycode(vk_control), lParam(содержит repeatcount и scancode) PostMessage хэндл окна, номер сообщения, vkkeycode(vk_L), lParam(содержит repeatcount и scancode) Но при этом ноль реакции. Через spy++ смотрел сообщения клавиатуры. При физическом нажатии так же генерируются два keydown-а, как и при эмуляции через postmessage. Содержимое сообщений идентичны. Но, в обоих случаях так же появляется сообщение wm_char, они отличаются по содержимому wParam, lParam. wm_char я не отправляю, оно генерируется, как я понимаю defwindowproc. Буду признателен и благодарен за решение или направление в нужную сторону, т.к. ситуация тупиковая, на данный момент.

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

textual
Листинг программы
  1. Private Declare Function FindWindow Lib "user32" _
  2.    Alias "FindWindowA" _
  3.    (ByVal lpClassName As String, _
  4.    ByVal lpWindowName As String) As Long
  5.    
  6. Private Declare Function SendMessage Lib "user32" Alias _
  7.  "SendMessageW" (ByVal hwnd As Long, ByVal wMsg As Long, _
  8.  ByVal wParam As Long, lParam As Any) As Long
  9.    
  10. 'функция GetMenu определяет форму с нужным меню
  11. Private Declare Function GetMenu Lib "user32" _
  12. (ByVal hwnd As Long) As Long
  13. 'функция GetSubMenu определяет заголовок меню _
  14. с которым будет идти работа
  15. Private Declare Function GetSubMenu Lib "user32" _
  16. (ByVal hMenu As Long, ByVal nPos As Long) As Long
  17. 'функция GetMenuItemID определяет пункт меню с которым
  18. 'будет идти работа
  19. Private Declare Function GetMenuItemID Lib "user32" _
  20. (ByVal hMenu As Long, ByVal nPos As Long) As Long
  21. Private Const WM_COMMAND As Long = &H111
  22.  
  23. Private Sub Command1_Click()
  24. Dim hMenu&, hSubMenu&, hMenuItem& 'объявление переменых типом Long
  25. Dim hwnd As Long
  26. hwnd = FindWindow(vbNullString, "Target") ' Ищем жертву
  27. Print hwnd ' это для контроля, потом все Print можно удалить
  28. 'определяем на какой форме нам нужно меню
  29. hMenu = GetMenu(hwnd)
  30. Print hMenu
  31. 'определяем заголовок, если у Вас есть, например
  32. 'File и Edit, то индексом задаёте нужный
  33. hSubMenu = GetSubMenu(hMenu, 0)
  34. Print hSubMenu
  35. 'здесь мы определяем, что работать хотим с первым _
  36. пунктом меню, т.к. индекс равен 0
  37. hMenuItem = GetMenuItemID(hSubMenu, 0)
  38. Print hMenuItem
  39. ' клик по первому пункту
  40. SendMessage hwnd, WM_COMMAND, hMenuItem, ByVal 0&
  41. End Sub

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


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

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

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

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

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

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