Выполнение составной команды оболочки XDOTOOL требует, чтобы задержка была выполнена успешно

Я создаю приложение в 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() функции, вызывающие такое поведение

0

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]