执行复合XDOTOOL shell命令需要延迟才能成功执行

时间:2018-10-18 09:06:31

标签: c++ xdotool

我正在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()函数时是否缺少某些东西

0 个答案:

没有答案