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