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

  1. Добрый день. Есть тестовое приложение, оно содержит один элемент меню, на котором висит 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

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

Private Declare Function FindWindow Lib "user32" _
   Alias "FindWindowA" _
   (ByVal lpClassName As String, _
   ByVal lpWindowName As String) As Long
   
Private Declare Function SendMessage Lib "user32" Alias _
 "SendMessageW" (ByVal hwnd As Long, ByVal wMsg As Long, _
 ByVal wParam As Long, lParam As Any) As Long
   
'функция GetMenu определяет форму с нужным меню
Private Declare Function GetMenu Lib "user32" _
(ByVal hwnd As Long) As Long
'функция GetSubMenu определяет заголовок меню _
с которым будет идти работа
Private Declare Function GetSubMenu Lib "user32" _
(ByVal hMenu As Long, ByVal nPos As Long) As Long
'функция GetMenuItemID определяет пункт меню с которым
'будет идти работа
Private Declare Function GetMenuItemID Lib "user32" _
(ByVal hMenu As Long, ByVal nPos As Long) As Long
Private Const WM_COMMAND As Long = &H111
 
Private Sub Command1_Click()
Dim hMenu&, hSubMenu&, hMenuItem& 'объявление переменых типом Long
Dim hwnd As Long
hwnd = FindWindow(vbNullString, "Target") ' Ищем жертву
Print hwnd ' это для контроля, потом все Print можно удалить
'определяем на какой форме нам нужно меню
hMenu = GetMenu(hwnd)
Print hMenu
'определяем заголовок, если у Вас есть, например
'File и Edit, то индексом задаёте нужный
hSubMenu = GetSubMenu(hMenu, 0)
Print hSubMenu
'здесь мы определяем, что работать хотим с первым _
пунктом меню, т.к. индекс равен 0
hMenuItem = GetMenuItemID(hSubMenu, 0)
Print hMenuItem
' клик по первому пункту
SendMessage hwnd, WM_COMMAND, hMenuItem, ByVal 0&
End Sub

СДЕЛАЙТЕ РЕПОСТ

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



Похожие ответы
  1. Добрый день! Помогите, пожалуйста, разобраться как работать с эмуляцией нажатия кнопки на форме. У меня есть UserForm1 на которой расположена кнопка Commanbutton1 и Label1. В Label1 размещен таймер обратного отсчета. Когда таймер заканчивает свою работу появляется сообщение Msg Box и при нажатии на ОК мне нужно, чтобы по Commanbutton1 прошло событие, как будто ее нажали, при этом сама форма скрывается (до истечения время форма активна и кнопка выполняет другие микро программы).

  1. Здравствуйте ! Возьмем к примеру, CommandButton. Хочу уметь перетаскивать форму, удерживая курсор мыши на кнопке. Следовательно обычный клик (_Click (Mouse_Down + Mouse_Up) также должен нормально отрабатывать. Сейчас конфликтный код имеет такой вид:

  1. Проблемка вот в чем. Скорее всего я не до конца понимаю принцип работы функций, которые использую. Простая программка, через промежутки времени жмет на кнопку:

  1. Какой код нужен, чтобы посчитать количество нажатий кнопки Command1 и после, например, шести нажатий произошло событие txtAdd.SetFocus.Добавлено через 1 час 7 минут В принципе, я решил это так:

  1. Знаю такое уже было, а именно тут:http://www.sql.ru/forum/932574/vb6-p...hatie-klavishi Не знаю как реализовать на ВБ. Алгоритм: Клавиша j нажата sleep 5000 Клавиша j отжата. Так как это сделать??!

  1. Подскажите код программы на virtual basic которая бы в фоновом режиме осуществляла бы имитацию нажатия клавиши (только одной и той же клавиши), обжатие клавиши, и повтор циклы через 2 секунды, данное действие должно выполнятся бесконечно до закрытия программы. Программа должна работать в фоновом режиме и выполнять действие в полно экранных приложениях. В basic не селен, если можно поподробнее. Заранее большое спасибо

  1. всем привет. как или с помощью чего можно отследить дополнительные кнопки мыши?

  1. Здравствуйте. Пожалуйста помогите с кодом. Нужно написать программу, что бы при нажатии "Q" нажималась ПКМ затем через долю секунда ЛКМ.

  1. Приветствую =) Вот написал я простенький браузер на VB, загрузил страничку и есть на этой страничке одна нужная кнопка из "тысячи" других. Как имитировать нажатие мыши на эту кнопку? можно сказать авто-клик.. Нет ли примерчиков, вдруг уже кто то писал такого рода программы? Может есть пример на других языках программирования?