【问题标题】:Problem with Keypress simulation on Linux (Ubuntu 18)Linux(Ubuntu 18)上的按键模拟问题
【发布时间】:2019-02-24 18:49:06
【问题描述】:

我正在制作一个爱好项目,它基本上是一个非常古老的 Flash 游戏的机器人,鼠标移动和点击工作正常,但所有按键都会使操作系统滞后/卡顿,有时会停止收听所有键盘输入,真假。

我开始只使用带有 XTests 的 XLib,但没有用,所以我尝试了 XSendEvent 而不是 XTests,但所有症状都保持不变,所以最后一次尝试是使用 XDO,它给出了更好的结果,但仍然冻结了操作系统。

这是我试图用来模拟按键的当前 sn-p:

//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 方法,但我没有找到任何解决方案来将事件发送到其他窗口,如果有可能实现这一点会很棒!

我正在尝试自动化的游戏名为“Storm the House”

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

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

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

【问题讨论】:

  • 欢迎使用 XLib 和 XDo 进行鼠标和键盘输入的任何替代方案
  • 我测试了这是不同的操作系统,我注意到这只发生在 GNOME 接口上,GNOME 是否与 x11 的事件模拟存在某种不兼容?

标签: c++ linux qt xlib


【解决方案1】:

您是否曾尝试从命令行使用 xdotool。要使用 xdotool,您需要先安装软件包。 要模拟按键,您可以使用。

xdotool key <key>

例如,如果你想模拟 X 的按键,你可以使用这个代码

xdotool key x

或任何其他组合,如

xdotool key ctrl+f

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

xdotool key D BackSpace 

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

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

【讨论】:

  • 是的,它在实际发送按键之前有点滞后,虽然问题的重点与 xdotool 完全不同,它是关于以编程方式发送按键而不需要控制台命令,标签 xdotool 被插入由于到作为 xdotool 基础的 xdo.h
  • 我用这个工具在不同的操作系统中测试了关键模拟是如何滞后的,我发现它只发生在 GNOME 界面上,但是这个解决方案并不能解决问题
【解决方案2】:

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

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

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

【讨论】:

  • 这有点像 hack,可能很难维护。有没有办法使用一些不同于 xlib 的库来操作它?
  • 经过一番挖掘,我发现了uinput 内核模块,它可以提供更好的界面:kernel.org/doc/html/v4.16/input/uinput.html
猜你喜欢
  • 2018-10-15
  • 2020-11-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-21
  • 1970-01-01
  • 2011-09-20
  • 2019-11-12
相关资源
最近更新 更多