Как отправить нажатия клавиш (F5) из терминала в программу с графическим интерфейсом?

40

Я использую Raspberry Pi в сочетании с Chromium (режим киоска), чтобы показать некоторые характеристики. У Pi нет подключенной клавиатуры, поэтому я искал решение для отправки нажатий клавиш с терминала на процесс Chromium (вкладка) . Обычный ввод работает, но как я могу отправить что-то вроде F5(специальный ключ: обновление браузера) через это решение?

# pidof chromium
20809 20790 20788 20786 20783
# echo 'some text' > /proc/20809/fd/0
burnersk
источник

Ответы:

51

Программы с графическим интерфейсом не читают со своего стандартного ввода, они получают свой ввод с X-сервера . Существуют инструменты для ввода нажатия клавиши в окне. xdotool довольно распространенный и удобный.

Вам нужно будет найти идентификатор окна, которому вы хотите отправить нажатие клавиши. Вы можете сделать это с помощью xdotool. xdotool search --class Chromeвозвращает список идентификаторов всех окон Chrome. Если это возвращает более одного, вам нужно выбрать тот, который вы хотите. Вы можете использовать, xdotool search --nameчтобы соответствовать по названию вместо класса. Вы также можете проанализировать вывод wmctrl и извлечь нужный идентификатор окна.

Как только вы нашли правильный идентификатор окна, вы можете позвонить, xdotoolчтобы ввести нажатие клавиши. К сожалению, многие приложения отклоняют синтетические события, то есть нажатия клавиш и события мыши, отправленные другим приложением. Это касается текущих версий Chrome. Можно ввести нажатие клавиши из другого приложения с помощью другого механизма, но для этого необходимо сфокусировать окно. Вы можете сделать все это с помощью xdotool, но это приведет к быстрому переключению фокуса на окно Chrome и обратно. Следующий фрагмент отправляет F5в первое окно Chrome (в произвольном порядке).

xdotool search --class Chrome windowactivate --sync %1 key F5 windowactivate $(xdotool getactivewindow)

Или с более старыми версиями xdotool:

xdotool windowactivate $(xdotool search --class Chrome) &&
xdotool key F5 &&
xdotool windowactivate $(xdotool getactivewindow)

Помните, что это отправляет F5это окно, и программа сама решает, что с ним делать. В Chrome это перезагружает текущую вкладку.

Жиль "ТАК - перестань быть злым"
источник
4
--windowidфлаг теперь --window(команда предупреждает вас больше)
Луи Maddox
2
--titleВариант теперь --name(команда точно так же предупреждает)
jpaugh
2
xdotool search --class Chrome key F5
Вложение
1
@Blauhirn Вложенность была необходима в более старых версиях xdotool. Но спасибо, я обновил свой ответ, чтобы также показать новый синтаксис.
Жиль "ТАК - перестань быть злым"
О, и так как я обновляю это, Chrome в настоящее время отвергает синтетические события. вздох
Жиль "ТАК - перестань быть злым"
15

Решение, предложенное выше, использует xdotool как это

 xdotool key --windowid <window> <keystroke>

который не работал для меня. После некоторых экспериментов я достиг

 xdotool windowactivate --sync <window> key <keystroke>

Однажды, похоже, это сработало, я определил некоторые скрипты и обновил свой файл .lircrc, как показано здесь:

http://pcfellow.com/ClementineRemote.html

Майк
источник
Интересно, почему ваш первый пример не работает? Было бы неплохо посылать нажатия клавиш в не сфокусированные окна.
Джеремия
1
@ Geremia, вероятно, он не работает по причине, указанной в ОТПРАВКАХ ОТСУТСТВИЯ в документации xdotool.
Джантхельм
4

У меня был похожий случай использования Raspberry Pi с Raspbian Wheezy. Мне нужно было вращать вкладки в Chrome, используя режим киоска (к сожалению, установка расширения для этого на старом Chrome больше нецелесообразна). Пример принятого ответа имеет некоторые опечатки или просто не работает с моими версиями программного обеспечения, вот что работает для меня:

xdotool key --window "$(xdotool search --class Chromium | head -1)" Ctrl+Tab
Бен Брайан
источник
4

Если вы используете Chromium для отображения пользовательской веб-страницы и хотите, чтобы она регулярно обновлялась, вы можете добавить к ней следующий тег:

<meta http-equiv="refresh" content="5">

автоматически обновлять его каждые 5 секунд (вы можете установить его короче или длиннее, если хотите).

Андре Бори
источник
2
Хорошая попытка, но у меня нет Твиттера, программного обеспечения для мониторинга моего интернет-провайдера и других сайтов, за
которыми
4
Вы можете вставить этот тег на страницу, используя скрипт пользователя. Может быть менее хрупким решением, чем отправка нажатия клавиши в окно.
Шербанг
2

Я исторически использовал Auto Hot Key, чтобы делать такие вещи, как отправка нажатий клавиш, однако это не доступно в Linux, но быстрый поиск в Google показывает, что есть IronAHK ( http://www.ironahk.net/ ), там не так много документация еще доступна, но это может помочь.


источник
Ссылка больше не работает.
Антонин Прочазка