在Linux(Ubuntu 18)上进行按键模拟的问题

时间:2019-02-24 18:49:06

标签: c++ linux qt xlib

我正在做一个爱好项目,基本上是一个非常老的Flash游戏的机器人,鼠标移动和单击的效果很好,但是所有按键操作都会使操作系统滞后/停滞,有时会停止监听所有键盘输入,真假。

我开始仅将XLib与XTests一起使用,但是没有用,所以我尝试使用XSendEvent而不是XTests,但是所有症状都保持不变,因此最后一次尝试是使用XDO,它提供了更好的结果,但仍然冻结了OS。

这是我尝试用来模拟按键的当前代码段:

//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,paint事件绘制所需信息,它是另一个对象,在CheatCore中没有直接影响,但这是用于在透明窗口上绘制并忽略事件的窗口标志。

setWindowFlags(Qt::WindowTransparentForInput | Qt::FramelessWindowHint | 
Qt::WindowStaysOnTopHint);
setAttribute(Qt::WA_NoSystemBackground);
setAttribute(Qt::WA_TranslucentBackground);
setAttribute(Qt::WA_TransparentForMouseEvents);

我无法理解是什么原因导致了这种奇怪的行为,这可能是窗口系统吗?

此外,我试图找到一种模拟鼠标/键盘输入的Qt方法,但是如果有可能的话,我没有设法找到任何将事件发送到其他窗口的解决方案!

我要使其自动化的游戏称为“ Storm the House”

如果有兴趣,可以访问在线仓库的链接:link

您能帮助我完成这项工作吗?谢谢!

有关设置的上下文: 使用VGA和Nvidia驱动程序的Ubuntu 18.10(如果可能会影响xserver)

2 个答案:

答案 0 :(得分:0)

您曾经尝试从命令行使用xdotool吗?要使用xdotool,您需要先安装软件包。 要同时模拟按键,可以使用。

xdotool key <key>

例如,如果要模拟X的按键,则可以使用此代码

xdotool key x

或其他任何组合,例如

xdotool key ctrl+f

您还可以将按键替换为另一种,例如,如果要将按键D替换为Backspace,可以尝试这种按键

xdotool key D BackSpace 

您可以在线阅读完整的guid,也可以使用此工具编写脚本并在许多不同的情况下使用它。 您也可以将其用于远程连接。

我希望这可以帮助您解决小问题。

答案 1 :(得分:0)

使用evdev是特定于Linux的选项。

这是一个更简单的解决方案,因为您只需要打开正确的文件并将其写入。

看看这个similar question来了解如何开始。