Выполнение составной команды оболочки XDOTOOL требует, чтобы задержка была выполнена успешно - PullRequest
0 голосов
/ 18 октября 2018

Я создаю приложение в 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);

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(), вызывающих такое поведение

...