0

我正在 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()导致此行为的函数时是否遗漏了什么

4

0 回答 0