我正在 UNIX 上创建一个应用程序,它使用该命令xdotool
来伪造鼠标/键盘操作。该命令按预期工作,示例行:
xdotool mousemove 20 50 && xdotool mousedown 1 && xdotool mouseup 1
移动鼠标并按预期执行简单的单击。
但是,当尝试从 C 程序调用此命令时,需要拆分命令并在两者之间插入延迟(mousemove
,然后等待,然后mousedown && mouseup
)。
这些是涉及的相关代码:
命令的生成:
button = button + 1;
std::string moveCommand =
"xdotool mousemove "
+ std::to_string(realPosX)
+ " "
+ std::to_string(realPosY);
std::string btnStr = std::to_string(button);
std::string clickCommand =
"xdotool mousedown "
+ btnStr
+ " && xdotool mouseup "
+ btnStr;
exec(moveCommand + " && " + clickCommand);
//std::this_thread::sleep_for(std::chrono::duration<double>(0.1));
//exec(clickCommand);
执行功能:
std::string exec(const char * cmd)
{
/*
std::array<char, 128> buffer;
std::string result;
std::shared_ptr<FILE> pipe(popen(cmd, "r"), pclose);
if (!pipe)
{
throw std::runtime_error("popen() failed!");
}
while (fgets(buffer.data(), 128, pipe.get()) != nullptr)
{
result += buffer.data();
}
return result;
*/
std::cout << cmd << std::endl;
int retValue = system(cmd);
if(retValue != 0)
{
std::cerr << "Command \"" << cmd << "\" exited with value " << retValue << std::endl;
}
return "";
}
std::string exec(const std::string & st)
{
return exec(st.c_str());
}
到目前为止,我已经尝试过:
使用单独执行命令
popen
&&
通过使用一起执行命令popen
和以前一样,
system
自从我读到它之后就使用了对命令的阻塞调用(认为这可能是问题所在)。
到目前为止,它起作用的唯一方法是拆分命令并在两个调用之间设置延迟(从命令的生成中可以看出)。
没有延迟,鼠标移动了,但是点击没有效果。执行没有返回错误。
正如您在exec()
函数中看到的那样,我将命令打印到屏幕上,然后手动运行它以确保命令格式正确。该命令在 shell 上按预期运行。
我不知道在调用popen()/system()
导致此行为的函数时是否遗漏了什么