Я делаю хобби-проект, который, по сути, является ботом для очень старой флеш-игры, перемещение и нажатие мыши работает отлично, но все нажатия клавиш приводят к зависанию операционной системы и иногда прекращают прослушивание всех вводов с клавиатуры,реальный или поддельный.
Я начал использовать только 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)