Программно отправлять ввод с клавиатуры в графическое приложение (игру) в Windows

0

Я хотел бы иметь возможность использовать программу/скрипт для автоматической отправки элементов управления клавиатурой в очень простую видеоигру. Есть только 3 кнопки, которые должны работать, и они могут быть любыми 3 кнопками клавиатуры (привязки клавиш могут быть изменены в игре). Элементы управления в основном левые, правые, стреляющие.

Вещи, которые я пробовал: Python:

  • keybd_event
  • SendKeys
  • SendInput

C++:

  • SendInput с использованием wVk
  • SendInput напрямую вводит шестнадцатеричные коды сканирования в wScan с флагом KEYEVENTF_SCANCODE
  • SendInput с помощью MapVirtualKey для преобразования символа для wScan (включен флаг KEYEVENTF_SCANCODE)

Как бы то ни было, я столкнулся с этой проблемой, все указывают на вышеупомянутые подходы. Все они прекрасно работают для получения текста в "Блокноте" или других текстовых вводах (например, стрелка вверх прекрасно работает в командной строке, в результате чего появляется последний ввод команды). Они также прекрасно переносят персонажей в игру в том месте, где вы поместили свое имя в список высоких баллов.

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

То, что я не могу совершить, - это просто простые команды действий (слева, справа, стрелять - единственные команды, которые есть в простой игре). Я попробовал его с командами, установленными на клавиши со стрелками (по умолчанию) и 'a', 'd', 'w' в игре и проверенными с другими приложениями, которые отправляются этими командами, а также (в случае буквы клавиши) экран ввода высоких баллов в самой игре. Но он просто не регистрирует их в реальном игровом процессе.

Я могу использовать экранную клавиатуру из меню доступности, чтобы отправить нажатия клавиш, чтобы играть в игру. Если это сработает, кажется, что есть какой-то способ выполнить эту, казалось бы, простую задачу, но я нахожусь в полной потере, а результаты поиска наводнены раздробленными советами (перечисленные выше методы).

Может ли кто-нибудь указать мне на что-то, что может работать, а не на одну из перечисленных выше вещей, которые я уже пробовал, что все ответы на вопросы, подобные этой, кажется, предлагают?

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

Быстрый фрагмент кода, например:

#include <windows.h>

int main()
{   
    INPUT ip;

    // Time to focus the program
    Sleep(5000);

    ip.type = INPUT_KEYBOARD;
    ip.ki.dwFlags = KEYEVENTF_SCANCODE;

    //'w'
    ip.ki.wScan = 0x11;
    SendInput(1, &ip, sizeof(INPUT));

    ip.ki.dwFlags = KEYEVENTF_SCANCODE | KEYEVENTF_KEYUP;
    SendInput(1, &ip, sizeof(INPUT));
    return 0;
}

Эта простая программа через 5 секунд наберет букву "w" в "Блокнот" (или cmd или адресную строку браузера или что угодно - любой текстовый ввод, похоже, работает нормально). Теперь, в игре, если у меня есть "стрелять" к 'w', он отлично работает. Если я использую экранную клавиатуру и нажимаю "w", она работает. Но вышеупомянутая программа не приведет к тому, что действие "стрелять" произойдет в игре. Однако, если я изменю scancode на 0x58 ('F12'), программа будет соответствующим образом заставлять звук включаться в игру, точно так же, как если бы я нажал F12 на моей фактической клавиатуре.

  • 0
    getAsyncKeyState () в c ++ может работать, хотя не очень понятно, о чем вы спрашиваете ..
  • 0
    Определенно не то, что я ищу, извините. Я не уверен, как я могу объяснить более четко. Я пытаюсь автоматизировать отправку ввода с клавиатуры в простую аркадную игру на Windows. Я хочу программу, которая может, например, напечатать 'w' для меня. Я нашел много методов (перечисленных выше), которые прекрасно справляются с этой задачей в простых областях ввода текста, но не в графической игре. Все другие подобные вопросы, похоже, столкнулись с той же проблемой, что и я, получили те же (не рабочие) предложения, а затем замолчали без разрешения.
Показать ещё 1 комментарий
Теги:
automation
input

1 ответ

0
Лучший ответ

Похоже, что проблема заключается в том, что, хотя текстовый ввод обычно втягивает входные данные из буфера, игры в реальном времени будут пропускать нажатия клавиш, которые приходят и уходят так же быстро, как виртуальная клавиатура может их нажимать. Решение просто добавляет короткий вызов Sleep() между нажатием клавиши и клавиатурой.

Кроме того, для любого, кто работает в Python, который, как и я, использовал часто предлагаемый SendKeys.py без успеха, найдите функцию "playkeys" в коде и добавьте time.sleep (пауза) после key_down (vk), это должно решить проблему проблема (это сработало для меня).

Ещё вопросы

Сообщество Overcoder
Наверх
Меню