Я делаю хобби-проект, который в основном представляет собой бота для очень старой флеш-игры, движение мыши и щелчок работают нормально, но все нажатия клавиш заставляют операционную систему тормозить / заикаться и иногда перестают слушать все вводы с клавиатуры, настоящие или поддельные. .
Я начал использовать только XLib с XTests, но это не сработало, поэтому я попробовал XSendEvent вместо XTests, но все симптомы остались прежними, поэтому последняя попытка была с XDO, которая дала лучшие результаты, но все еще зависает ОС.
это текущий фрагмент, который я пытаюсь использовать для имитации нажатия клавиши:
//Constructor
CheatCore::CheatCore() {
xdo_t x = xdo_new(NULL);
Window *list;
xdo_search_t search;
unsigned int nwindows;
memset(&search, 0, sizeof(xdo_search_t));
search.max_depth = -1;
search.require = xdo_search::SEARCH_ANY;
search.searchmask = SEARCH_CLASS | SEARCH_ONLYVISIBLE;
search.winclass = "Chrome";
int id = xdo_search_windows(x, &search, &list, &nwindows);
qDebug() << nwindows;
if (!nwindows){
qDebug() << "Chrome not found";
return;
}
w = list[0];
//I have to call activate twice to really bring it forward, I suspect that its
//because I use a transparent "overlay" that show stats for the cheat and it is set as Aways on top
//(i used Qt to set it to not get any Events)
xdo_activate_window(x,w);
xdo_activate_window(x,w);
}
//there is a function that executes every second to check if a pixel color has changed,
//if so, then the SendKey is called to Reload weapon magazine pressing the "space" key
void CheatCore::SendKey(){
xdo_activate_window(x,w);
xdo_activate_window(x,w);
xdo_send_keysequence_window(x, w, "space", 500);
}
Я использую прозрачное наложение, чтобы показать статус бота, с отображением только некоторых чисел, это виджет, созданный с использованием Qt, который является AlwaysOnTop, и событие рисования рисует нужную информацию, это другой объект и не имеет прямого влияния на CheatCore, но это флаги окна, используемые для рисования поверх прозрачного окна и игнорирования событий.
setWindowFlags(Qt::WindowTransparentForInput | Qt::FramelessWindowHint |
Qt::WindowStaysOnTopHint);
setAttribute(Qt::WA_NoSystemBackground);
setAttribute(Qt::WA_TranslucentBackground);
setAttribute(Qt::WA_TransparentForMouseEvents);
Я так и не понял, что могло спровоцировать такое странное поведение, может быть оконная система?
Кроме того, я пытался найти способ Qt для имитации ввода с мыши/клавиатуры, но мне не удалось найти какое-либо решение для отправки событий в другие окна, если есть способ добиться этого, это было бы здорово!
Игра, которую я пытаюсь автоматизировать, называется "Штурмовать дом".
Если интересно, это ссылка на онлайн-репозиторий: ссылка на сайт
Можете ли вы помочь мне сделать эту работу? Спасибо!
Контекст настройки: Ubuntu 18.10 с использованием драйверов VGA и Nvidia (если это может повлиять на xserver)
Я тестировал разные ОС и заметил, что это происходит только с интерфейсами GNOME. Есть ли у GNOME какая-то несовместимость с симуляцией событий с x11?





Вы когда-нибудь пытались использовать xdotool из командной строки. Чтобы использовать xdotool, вам нужно сначала установить пакет. Чтобы имитировать нажатие клавиши, вы можете использовать.
xdotool key <key>
Например, если вы хотите имитировать нажатие клавиши для X, вы можете использовать этот код
xdotool key x
Или любая другая комбинация, например
xdotool key ctrl+f
Также вы можете заменить нажатие клавиши другим, например, если вы хотите заменить нажатие D на Backspace, вы можете попробовать это.
xdotool key D BackSpace
Вы можете прочитать полное руководство онлайн, также вы можете написать скрипт с помощью этого инструмента и использовать его в самых разных ситуациях. Также вы можете использовать его для удаленного подключения.
Я надеюсь, что это поможет вам с вашей маленькой проблемой.
Да, он немного отстает перед фактической отправкой нажатия клавиши, хотя фокус вопроса совершенно отличается от xdotool. Речь идет о программной отправке нажатий клавиш без необходимости консольных команд, тег xdotool был вставлен из-за xdo.h, который является основа xdotool
Я использовал этот инструмент, чтобы проверить в разных ОС, насколько отстает симуляция клавиш, я обнаружил, что это происходит только на интерфейсах GNOME, но это решение не устраняет проблему.
Использование evdev — это специфический вариант Linux.
Это более простое решение, так как вам просто нужно открыть правильный файл и записать в него.
Взгляните на этот аналогичный вопрос, чтобы узнать, как начать.
Это своего рода хак и, вероятно, его трудно поддерживать. Есть ли способ манипулировать этим, используя некоторую библиотеку, отличную от xlib?
Немного покопавшись, я нашел uinput модуль ядра, который обеспечивает более приятный интерфейс: kernel.org/doc/html/v4.16/input/uinput.html.
приветствуются любые альтернативы XLib и XDo для ввода с помощью мыши и клавиатуры