我正在UNIX上创建一个应用程序,该应用程序使用命令xdotool
来伪造鼠标/键盘操作。该命令按预期运行,示例行如下:
xdotool mousemove 20 50 && xdotool mousedown 1 && xdotool mouseup 1
移动鼠标并按预期执行简单的单击。
但是,当尝试从C程序实现对此命令的调用时,需要拆分命令并在两者之间插入延迟(mousemove
,然后等待,然后mousedown && mouseup
)。 / p>
这些是涉及的相关代码段:
命令的生成:
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);
exec函数:
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()
函数中所见,我将命令打印到屏幕上,然后手动运行它以确保命令格式正确。该命令在外壳上按预期运行。
我不知道在调用引起此行为的popen()/system()
函数时是否缺少某些东西