Я создаю приложение в 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()
функции, вызывающие такое поведение
Задача ещё не решена.
Других решений пока нет …