Проблема с симуляцией нажатия клавиш в Linux (Ubuntu 18) - PullRequest
0 голосов
/ 24 февраля 2019

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

Я начал использовать только 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)

Ответы [ 2 ]

0 голосов
/ 17 марта 2019

Использование evdev - это особая опция для Linux.

Это более простое решение, поскольку вам просто нужно открыть правильный файл и записать в него.

Взгляните на это похожий вопрос чтобы узнать, с чего начать.

0 голосов
/ 11 марта 2019

Вы когда-нибудь пытались использовать xdotool из командной строки.Чтобы использовать xdotool, вам нужно сначала установить пакет.Чтобы симулировать нажатие клавиши, вы можете использовать.

xdotool key <key>

Например, если вы хотите смоделировать нажатие клавиши для X, вы можете использовать этот код

xdotool key x

или любую другую комбинацию, например

xdotool key ctrl+f

Также вы можете заменить нажатие клавиши на другое, например, если вы хотите заменить нажатие D на Backspace, вы можете попробовать это

xdotool key D BackSpace 

Вы можете прочитать полное руководство онлайн,Также вы можете написать скрипт с помощью этого инструмента и использовать его во многих различных ситуациях.Также вы можете использовать его и для удаленного подключения.

Надеюсь, это поможет вам в вашей маленькой проблеме.

...