Форум программистов, компьютерный форум, киберфорум
Visual Basic
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.77/30: Рейтинг темы: голосов - 30, средняя оценка - 4.77
 Аватар для aptos
13 / 13 / 3
Регистрация: 04.06.2013
Сообщений: 156

Имитация нажатия клавиши Tab в стороннем приложении (игре)

08.09.2014, 15:26. Показов 6192. Ответов 27
Метки нет (Все метки)

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

Простая программка, через промежутки времени жмет на кнопку:
Visual Basic
1
2
3
Private Sub Timer1_Timer()
Call keybd_event(VK_TAB, 0, 0, 0)
End Sub
Либо так тоже пробовал:
Visual Basic
1
SendKeys "{TAB}", True
Мне нужен Tab, но с другими кнопками тоже не пашет. К примеру, когда брал нолик, при запуске программка успешно записывала его в текстбоксы и ворды, либо при запуске игры - в чат.

Но вот действия, которые должны просиходить в игре при нажатии Tab или того же нолика - не происходят.
В чем пробема?
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
08.09.2014, 15:26
Ответы с готовыми решениями:

Имитация нажатия ПКМ в стороннем приложении
Привет, понимаю что тема обсуждалась миллион раз, но я уже перерыл все что нашел и никак не дойдет что не так... Смотрите, смастерил хук на...

Имитация нажатия на кнопки в стороннем приложении
Во общем ситуация такая, есть установщик, в нём кнопка старт, после нажатия на нее появляется соглашение, ну и дальше появляются разные...

Перехват и имитация нажатия клавиши клавиатуры в чужом приложении
Есть тема... Нужно, чтобы при нажатии на кнопку, например f1 . У меня последовательно с разными задержками нажимались кнопки: ESC ...

27
Модератор
10048 / 3894 / 883
Регистрация: 22.02.2013
Сообщений: 5,847
Записей в блоге: 79
08.09.2014, 16:35
Цитата Сообщение от aptos Посмотреть сообщение
Простая программка, через промежутки времени жмет на кнопку:
А отпускать кнопку она думает?
Цитата Сообщение от aptos Посмотреть сообщение
Но вот действия, которые должны просиходить в игре при нажатии Tab или того же нолика - не происходят.
В чем пробема?
Возможно там стоит проверка на виртуальные нажатия.
1
1045 / 315 / 74
Регистрация: 13.07.2013
Сообщений: 1,270
08.09.2014, 16:39
Цитата Сообщение от aptos Посмотреть сообщение
Call keybd_event(VK_TAB, 0, 0, 0)
По идее, нужно отпускать еще. Что-то типа того:
Visual Basic
1
call keybd_event(VK_TAB, 0, 2, 0)
Может, заработает.
1
 Аватар для Pro_grammer
6807 / 2839 / 527
Регистрация: 24.04.2011
Сообщений: 5,308
Записей в блоге: 10
08.09.2014, 17:56
Цитата Сообщение от aptos Посмотреть сообщение
Проблемка вот в чем.
Если игра 2D, 3D, использующая DX или OGL, то в ней нажимать при помощи keybd_event не выйдет, можно и не мучиться с нажатиями-отжатиями.
Там надо внедрятся в процесс и опрашивать и возвращать нажатия клавиатуры средствами DX или OGL, или на чем там эта игра написана.
1
Модератор
10048 / 3894 / 883
Регистрация: 22.02.2013
Сообщений: 5,847
Записей в блоге: 79
08.09.2014, 18:09
Цитата Сообщение от Pro_grammer Посмотреть сообщение
Если игра 2D, 3D, использующая DX или OGL, то в ней нажимать при помощи keybd_event не выйдет, можно и не мучиться с нажатиями-отжатиями.
Там надо внедрятся в процесс и опрашивать и возвращать нажатия клавиатуры средствами DX или OGL, или на чем там эта игра написана.
Нет. К примеру GTA Vice city прекрасно работает с keybd_event.
1
1045 / 315 / 74
Регистрация: 13.07.2013
Сообщений: 1,270
08.09.2014, 18:29
Пробовал в современной игре (думаю, не уместно говорить какой) - все спокойно эмулируется.
Ни разу не встречался со случаем, когда приложение видело разницу между эмуляцией и реальным нажатием.
1
Модератор
10048 / 3894 / 883
Регистрация: 22.02.2013
Сообщений: 5,847
Записей в блоге: 79
08.09.2014, 18:29
Цитата Сообщение от Good-Morning Посмотреть сообщение
Ни разу не встречался со случаем, когда приложение видело разницу между эмуляцией и реальным нажатием.
Онлайн игры.
1
1045 / 315 / 74
Регистрация: 13.07.2013
Сообщений: 1,270
08.09.2014, 18:31
Цитата Сообщение от The trick Посмотреть сообщение
Онлайн игры.
В онлайн игре и тестил.
1
Модератор
10048 / 3894 / 883
Регистрация: 22.02.2013
Сообщений: 5,847
Записей в блоге: 79
08.09.2014, 18:38
Цитата Сообщение от Good-Morning Посмотреть сообщение
В онлайн игре и тестил.
Сам не играю в них, слышал что не работает в некоторых играх. Если бы я делал игру - я бы сделал так, тем более это легко проверить и отфильтровать.
2
 Аватар для aptos
13 / 13 / 3
Регистрация: 04.06.2013
Сообщений: 156
08.09.2014, 20:07  [ТС]
Я после того как тему создал, потом пошел и такую ерунду с кликом мыши сделал. Тоже не работало. Потом поставил задержку циклом, вроде заработало:
Visual Basic
1
2
3
4
5
6
Call mouse_event(...)
For i = 1 To 1000
 For j = 1 To 1000
 Next
 Next
Call mouse_event(...)
Что-то типо того.

А вот с нажатием непосредственно кнопок не вышло. Делал так:
Visual Basic
1
2
3
4
5
6
Call keybd_event(&H45, 0, 0, 0)
For i = 1 To 1000
 For j = 1 To 1000
 Next
Next
Call keybd_event(&H45, 0, 2, 0)
Кнопки-то жмет, а вотв игре реакции по-прежнему никакой.

Точно что-то не так делаю. Может еще какие идеи есть?
0
 Аватар для Pro_grammer
6807 / 2839 / 527
Регистрация: 24.04.2011
Сообщений: 5,308
Записей в блоге: 10
08.09.2014, 21:13
Цитата Сообщение от aptos Посмотреть сообщение
Точно что-то не так делаю. Может еще какие идеи есть?
Повторюсь для неверующих, если игра использует для ввода DirectInput, который работает напрямую с драйвером устройства, то нажатие невозможно эмитировать при помощи keybd_event или там SendMessage, PostMessage.
Для таких игр нужно использовать DirectInput, что то типа Microsoft.DirectX.DirectInput.Device(Sys temGuid.Keyboard).
На VB6 такого кода не видел, но на Си он существует
1
 Аватар для aptos
13 / 13 / 3
Регистрация: 04.06.2013
Сообщений: 156
08.09.2014, 21:30  [ТС]
Цитата Сообщение от Pro_grammer Посмотреть сообщение
Повторюсь для неверующих, если игра использует для ввода DirectInput, который работает напрямую с драйвером устройства, то нажатие невозможно эмитировать при помощи keybd_event или там SendMessage, PostMessage.
Для таких игр нужно использовать DirectInput, что то типа Microsoft.DirectX.DirectInput.Device(Sys temGuid.Keyboard).
На VB6 такого кода не видел, но на Си он существует
Почему с устройством мышь работает, а с устройством клавиатура уже не будет?
0
Модератор
10048 / 3894 / 883
Регистрация: 22.02.2013
Сообщений: 5,847
Записей в блоге: 79
08.09.2014, 21:55
Цитата Сообщение от Pro_grammer Посмотреть сообщение
Повторюсь для неверующих, если игра использует для ввода DirectInput, который работает напрямую с драйвером устройства, то нажатие невозможно эмитировать при помощи keybd_event или там SendMessage, PostMessage.
Для таких игр нужно использовать DirectInput, что то типа Microsoft.DirectX.DirectInput.Device(Sys temGuid.Keyboard).
На VB6 такого кода не видел, но на Си он существует
Проверил. keybd_event прекрасно работает с DirectInput (win7 x64), также прекрасно работает и SendInput.
Цитата Сообщение от aptos Посмотреть сообщение
Почему с устройством мышь работает, а с устройством клавиатура уже не будет?
Вторым параметром идет скэн-код, его нужно тоже заполнять, а не игнорировать.
1
 Аватар для aptos
13 / 13 / 3
Регистрация: 04.06.2013
Сообщений: 156
08.09.2014, 22:20  [ТС]
А можно немножко подробнее о параметрах, или ссылочку, где почитать можно ?
Я просто брал готовую строчку из интернета, вот и не знаю для чего конкретно каждый параметр.
0
Модератор
10048 / 3894 / 883
Регистрация: 22.02.2013
Сообщений: 5,847
Записей в блоге: 79
08.09.2014, 22:25
Цитата Сообщение от aptos Посмотреть сообщение
Я просто брал готовую строчку из интернета, вот и не знаю для чего конкретно каждый параметр.
Так нельзя делать ни в коем случае. Читай доки.
Ну по-хорошему нужно использовать SendInput, как написано в MSDN, но я объясню на примере keybd_event. Второй параметр (bScan) должен содержать аппаратный скэн-код клавиши. Получить его из виртуального кода можно функцией MapVirtualKey с параметром MAPVK_VK_TO_VSC.
1
 Аватар для aptos
13 / 13 / 3
Регистрация: 04.06.2013
Сообщений: 156
08.09.2014, 23:15  [ТС]
Спасибо)
Visual Basic
1
2
3
4
UINT WINAPI MapVirtualKey(
  _In_  UINT uCode,
  _In_  UINT uMapType
);
uCode, как я понимаю, клавиша? В каком формате указывать? Вроде как тут?:
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Const VK_ATTN = &HF6
Const VK_BACK = &H8
Const VK_CANCEL = &H3
Const VK_CAPITAL = &H14
Const VK_CLEAR = &HC
Const VK_CONTROL = &H11
Const VK_CRSEL = &HF7
Const VK_DECIMAL = &H6E
Const VK_DELETE = &H2E
Const VK_DOWN = &H28
Const VK_END = &H23
Const VK_EREOF = &HF9
Const VK_ESCAPE = &H1B
Const VK_EXECUTE = &H2B
Const VK_EXSEL = &HF8
0
Модератор
10048 / 3894 / 883
Регистрация: 22.02.2013
Сообщений: 5,847
Записей в блоге: 79
08.09.2014, 23:19
Лучший ответ Сообщение было отмечено aptos как решение

Решение

Цитата Сообщение от aptos Посмотреть сообщение
uCode, как я понимаю, клавиша? В каком формате указывать? Вроде как тут?
Можно так, в VB6 уже есть встроенные константы виртуальных клавиш начинающиеся с vbKey(клавиша)
Visual Basic
1
keybd_event vbKeyX, MapVirtualKey(vbKeyX, MAPVK_VK_TO_VSC), 0, 0
2
 Аватар для aptos
13 / 13 / 3
Регистрация: 04.06.2013
Сообщений: 156
08.09.2014, 23:27  [ТС]
И снова спасибо!

А можно спросить, в чем смысл скэн-кода клавиши и какое он значение имеет для эмулирования нажатия?
0
Модератор
10048 / 3894 / 883
Регистрация: 22.02.2013
Сообщений: 5,847
Записей в блоге: 79
08.09.2014, 23:30
Цитата Сообщение от aptos Посмотреть сообщение
А можно спросить, в чем смысл скэн-кода клавиши и какое он значение имеет для эмулирования нажатия?
http://vsokovikov.narod.ru/New... n_code.htm
1
 Аватар для aptos
13 / 13 / 3
Регистрация: 04.06.2013
Сообщений: 156
08.09.2014, 23:42  [ТС]
Что бы ты не объяснял, всегда получается. Спасибо
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
08.09.2014, 23:42
Помогаю со студенческими работами здесь

Имитация нажатия клавиш в стороннем окне
Я знаю текст заголовка окна. Как мне передать в него нажатия клавиш и в том числе специальных - таких как esc, enter? Можно пойти иным...

Нажатие кнопок в стороннем приложении (игре)
Приложение должно способом имуляции нажимать на кнопки в игре, но данные способ не работает, тоесть приложение работает только на рабочем...

Имитация нажатия Tab с помощью keybd_event
Имитирую нажатия клавиш в сторонней программе с помощью Private Declare Sub keybd_event Lib "user32.dll" _ ...

Опрос нажатия кнопки в стороннем приложении
Добрый день, пишу на VS2017 код, который должен выдать реакцию при клике мышкой на цифре "9" калькулятора. Экспериментальным...

Эмуляция нажатия клавиш в стороннем приложении
я запускаю процесс, а значит я имею всё о этом процессе(хэндл и прочее) и мне нужно послать на этот процесс нажатия клавишь. мне нужно,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru