Linux上的Keypress仿真问题(Ubuntu 18)

问题描述 投票:0回答:2

我正在做一个业余爱好项目,基本上是一个非常老的Flash游戏机器人,鼠标移动和点击工作正常,但所有按键操作使操作系统滞后/断断续续,有时停止听所有键盘输入,真实或假。

我开始只使用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方式,但我没有设法找到任何解决方案将事件发送到其他窗口,如果有可能实现这一点将是伟大的!

我试图自动化的游戏被称为“风暴之家”

如果有兴趣,这是在线回购的链接:link

你能帮我做这个吗?谢谢!

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

c++ linux qt xlib
2个回答
0
投票

你有没有试过从命令行使用xdotool。要使用xdotool,您需要先安装软件包。要模拟按键,您可以使用。

xdotool key <key>

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

xdotool key x

或任何其他组合,如

xdotool key ctrl+f

您也可以用另一个按键替换按键,例如,如果您想用Backspace替换按D键,您可以试试这个

xdotool key D BackSpace 

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

我希望这可以帮助你解决一些小问题。


0
投票

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

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

看看这个similar question,看看如何开始。

© www.soinside.com 2019 - 2024. All rights reserved.