^
 Аватар для Вадим Мошев
425 / 50 / 16
Регистрация: 23.07.2014
Сообщений: 301
Delphi 6-7

Как в Windows 10 передать нажатие клавиш в окно MMORPG игры?

11.09.2021, 01:08. Показов 3326. Ответов 13

Студворк — интернет-сервис помощи студентам
Здравствуйте.

Я на ноутбуке, находящемся под управлением Windows 7 x64, пишу небольшую программу, которая должна по таймеру передавать в окно MMORPG игры (название не хотел бы пока говорить) нажатия некоторых клавиш. Для разработки используется Borland Delphi 7 (мне удалось найти в Интернете версию, работающую под x64). Сама же разрабатываемая программа должна работать под Windows 10. Игра находится не в полноэкранном режиме.

Мной были найдены два способа эмулировать нажатия клавиш в чужом окне. Первый состоит в использовании функции postMessage, а второй — в использовании функции keybd_event. Но ни один из них не работает должным образом на Windows 10, но работает идеально на Windows 7. Ниже расскажу подробнее о том, как я использовал оба способа.

postMessage.

С помощью этой функции я сторонним окнам шлю сообщение WM_KEYDOWN, передавая в параметре нажатую клавишу.

Результат на Windows 7: работает на всех протестированных приложениях (кроме блокнота, просто я получаю описатель окна, передавая в findWindow лишь его имя, вместо имени класса идёт nil).

Результат на Windows 10: отсутствует — ни в одно окно нажатие не передаётся. Согласно этой теме: PostMessage VS Win 10, это — очень странно, и работать должно, но там не написано, что значит «особым образом работать с приложениями», поиск в Интернете тоже не дал результатов. Пытался подключиться к приложению по классу окна — нет эффекта.

keybd_event.

Результат на Windows 7: работает на всех протестированных приложениях, включая блокнот.

Результат на Windows 10: работает везде, кроме окна целевой игры. Окно игры не реагирует на эмуляцию.

Я знаю, что ещё есть sendMessage, но эта функция не работала вообще нигде.

===========

Казалось бы, игра могла быть защищена от эмуляции нажатия клавиш, но почему тогда оба способа эмуляции работают под Windows 7?

===========

Для иллюстрации всего выше написанного я написал тестовую программу, которая использует как postMessage, так и keybd_event (не вместе, конечно).

Чтобы было понятно, как использовать программу, я снабдил её пояснениями, из которых должно быть всё ясно.

Исходники (Delphi 7, напоминаю) (без экзешника) можно скачать здесь: test.zip

Если вы не боитесь, можете скачать экзешник: Project1.zip


===========
Собственно, прошу помощи. Скажите, как можно заставить мою программу, работая под windows 10, эмулировать нажатия клавиш в чужих окнах, включая рассматриваемую игру.

Заранее большое спасибо.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
11.09.2021, 01:08
Ответы с готовыми решениями:

Как передать нажатие клавиш в окно другого приложения
Доброго времени суток! Солнце уже встает, а я не ложился... Не могу решить проблему передачи нажатия клавиши в другое приложение. Делаю...

Передать нажатие клавиш в окно RDP
Здравствуйте Ув. Форумчане! Перерыл MSDN в поисках решения на свой вопрос, но ничего путного пока найти не удалось. Смысл таков,...

Как определить нажатие клавиш, даже когда окно не активно
Привет, помогите плиз. Как в VB 2010 считывать нажатие клавиш, даже когда окно VB не активно, допустим когда играю или что нибудь набираю в...

13
68 / 33 / 11
Регистрация: 18.07.2014
Сообщений: 263
13.09.2021, 08:57
Вадим Мошев, Попробуйте так

Delphi
1
2
3
  keybd_event(keyCode, 0, 0, 0);
  Sleep(30);
  keybd_event(keyCode, 0, KEYEVENTF_KEYUP, 0)
если не получится то так

Delphi
1
2
3
  keybd_event(keyCode, MapVirtualKey(keyCode,0), 0, 0);
  Sleep(30);
  keybd_event(keyCode, MapVirtualKey(keyCode,0), KEYEVENTF_KEYUP, 0);
опишите ощущения.
0
^
 Аватар для Вадим Мошев
425 / 50 / 16
Регистрация: 23.07.2014
Сообщений: 301
13.09.2021, 09:01  [ТС]
KOTOM, спасибо, надо будет попробовать. Однако у меня сразу же вопрос возник. Вот вы тут используете процедуру sleep(). Скажите, должна ли тут совместно с ней использоваться application.processMessage?
0
68 / 33 / 11
Регистрация: 18.07.2014
Сообщений: 263
13.09.2021, 09:05
Вадим Мошев, Нет не должна. application.processMessage изпользуется для обновления интерфейса ВАШЕЙ программы, когда она что-то долго и нужно делает. А если точнее, то application.processMessage оптом обрабатывает все накопившиеся сообщения в очереди сообщений вашей программы.
0
^
 Аватар для Вадим Мошев
425 / 50 / 16
Регистрация: 23.07.2014
Сообщений: 301
13.09.2021, 09:08  [ТС]
Спасибо, я попробую и отпишусь обязательно
0
 Аватар для zvygin1964
11 / 11 / 0
Регистрация: 29.06.2013
Сообщений: 93
20.09.2021, 12:17
Windows XP 32 не работает.
0
^
 Аватар для Вадим Мошев
425 / 50 / 16
Регистрация: 23.07.2014
Сообщений: 301
20.09.2021, 17:34  [ТС]
KOTOM, здравствуйте. К сожалению, ни один из предложенных вами способов также не работает. Они оба передают нажатия клавиш в приложения, но только под Windows 7 идёт передача нажатий в игру, что же касается window 10, то там всё плохо — в игру нажатия не передаются.
0
68 / 33 / 11
Регистрация: 18.07.2014
Сообщений: 263
21.09.2021, 21:32
Вадим Мошев, в игру не передаются, а в другие приложения типа блокнота передаются?
0
^
 Аватар для Вадим Мошев
425 / 50 / 16
Регистрация: 23.07.2014
Сообщений: 301
21.09.2021, 21:37  [ТС]
KOTOM,
Цитата Сообщение от KOTOM Посмотреть сообщение
в игру не передаются, а в другие приложения типа блокнота передаются?
Да, keybd_event() на Windows 10 передаёт нажатия клавиш во все приложения, на которых я тестировал (Блокнот, Sublime Text, Калькулятор), кроме игры.
0
68 / 33 / 11
Регистрация: 18.07.2014
Сообщений: 263
22.09.2021, 10:49
Вадим Мошев, Значит надо пробовать SendInput но вообще странно. Если и это не поможет значит игра каким-то своим мокрописечным способом блочит весь эмулированный ввод и надо покупать аппаратный эмулятор.
0
^
 Аватар для Вадим Мошев
425 / 50 / 16
Регистрация: 23.07.2014
Сообщений: 301
27.09.2021, 11:53  [ТС]
KOTOM,
Цитата Сообщение от KOTOM Посмотреть сообщение
Значит надо пробовать SendInput но вообще странно.
Большое спасибо, я попробую.

Цитата Сообщение от KOTOM Посмотреть сообщение
игра каким-то своим мокрописечным способом блочит весь эмулированный ввод
Можно было так сказать, но я выше говорил, что на Windos 7 никакой блокировки нет. Вот что странно. Если там стоит какая-то навороченная блокировка, которая может работать только под windows 10, то она не спасёт тех, кто заинтересован в честной игре пользователей и блокировки эмуляций — ведь всегда можно поставить виртуальную машину...

___

А ещё... я знаете, что заметил. Когда я подключался по Any Desk к компьютеру с Windows 10, где надо было протестировать эмуляцию, я заметил, что, для того чтобы управлять игрой посредством Any Desk (с помощью программы-эмулятора), подключившемуся клиенту (то есть, мне), надо предоставить расширенные права (в Any Desk есть кнопка «Предоставить расширенные права»). Без таких прав работать с окном программы посредством Any Desk невозможно. Это не касается остальных приложений. Для работы с блокнотом, калькулятором, Sublime Text расширенных прав не требовалось.

Как вы считаете, это связано как-то с правами?
0
68 / 33 / 11
Регистрация: 18.07.2014
Сообщений: 263
27.09.2021, 14:37
Вадим Мошев, Насчёт прав не знаю, никогда не сталкивался. Ещё кстати можно взять Microsoft Spy++ и посмотреть какие сообщения приходят в игру на Windows 7 и на Windows 10 как при обычном вводе так и при эмулированом. Возможно на Windows 10 у них через Raw Input работает, хотя в таком случае я не понимаю что на Win7 им мешало так же сделать. В любом случае стоит глянуть приходят ли WM_KEYDOWN и WM_KEYUP на десятке или нет.
1
0 / 0 / 0
Регистрация: 07.07.2022
Сообщений: 3
07.07.2022, 08:27
SendInput ?
0
^
 Аватар для Вадим Мошев
425 / 50 / 16
Регистрация: 23.07.2014
Сообщений: 301
07.07.2022, 08:42  [ТС]
Цитата Сообщение от den48579 Посмотреть сообщение
SendInput ?
Может быть, но всем спасибо, тема больше не актуальна, во всяком случае, пока.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
07.07.2022, 08:42
Помогаю со студенческими работами здесь

SDL кроссплатформенные игры - Как обрабатывать событие нажатие клавиш?
Решил перейти на SDL с инициализацией разобрался благо материал много помогите как там обрабатывать событие нажатие клавиш клавиатуры...

Как запретить нажатие определенных сочетаний клавиш на Windows 8?
1. Как запретить нажатие определенных сочетаний клавиш на Windows 8? 2. Как сделать форму поверх всех окон?

Отправить нажатие клавиш в свернутое окно
Всем привет. Моя задача отправить нажатие клавиши "W" в свернутое чужое окно. Использую этот код: var h:hwnd; // ?????????? begin ...

Нажатие клавиш WASD из консоли в окно
Доброго времени суток. Я совсем новенький в C++ и надо чтоб клавиши зажимались на 1 секунду, а то и более. Вот код: Примечание: всё...

Нажатие клавиш в неактивное приложение (спам бот для свёрнутой игры)
Доброго времени суток! Стоит сказать что я не давно отошёл от "Hello, World!" а значит тупить я буду жёстко :) 1) Перед тем как...


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

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Опции темы

Новые блоги и статьи
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru