我正在做一个业余爱好项目,基本上是一个非常老的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)
你有没有试过从命令行使用xdotool。要使用xdotool,您需要先安装软件包。要模拟按键,您可以使用。
xdotool key <key>
例如,如果要模拟X的按键,可以使用此代码
xdotool key x
或任何其他组合,如
xdotool key ctrl+f
您也可以用另一个按键替换按键,例如,如果您想用Backspace替换按D键,您可以试试这个
xdotool key D BackSpace
您可以在线阅读完整的guid,也可以使用此工具编写脚本并在许多不同的情况下使用它。您也可以将它用于远程连接。
我希望这可以帮助你解决一些小问题。