Я хотел бы иметь возможность использовать программу/скрипт для автоматической отправки элементов управления клавиатурой в очень простую видеоигру. Есть только 3 кнопки, которые должны работать, и они могут быть любыми 3 кнопками клавиатуры (привязки клавиш могут быть изменены в игре). Элементы управления в основном левые, правые, стреляющие.
Вещи, которые я пробовал: Python:
C++:
Как бы то ни было, я столкнулся с этой проблемой, все указывают на вышеупомянутые подходы. Все они прекрасно работают для получения текста в "Блокноте" или других текстовых вводах (например, стрелка вверх прекрасно работает в командной строке, в результате чего появляется последний ввод команды). Они также прекрасно переносят персонажей в игру в том месте, где вы поместили свое имя в список высоких баллов.
Я также могу успешно отправить 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 на моей фактической клавиатуре.
Похоже, что проблема заключается в том, что, хотя текстовый ввод обычно втягивает входные данные из буфера, игры в реальном времени будут пропускать нажатия клавиш, которые приходят и уходят так же быстро, как виртуальная клавиатура может их нажимать. Решение просто добавляет короткий вызов Sleep() между нажатием клавиши и клавиатурой.
Кроме того, для любого, кто работает в Python, который, как и я, использовал часто предлагаемый SendKeys.py без успеха, найдите функцию "playkeys" в коде и добавьте time.sleep (пауза) после key_down (vk), это должно решить проблему проблема (это сработало для меня).