Як надіслати натискання клавіш (F5) з терміналу в програму GUI?


40

Я використовую Raspberry Pi в поєднанні з Chromium (режим кіоску), щоб показати деякі статистичні дані. У Pi немає підключеної клавіатури, тому я шукав рішення для надсилання натискань клавіш з терміналу на процес Chromium (вкладка) . Нормальне введення працює, але як я можу надсилати щось подібне F5(спеціальний ключ: оновлення браузера) через це рішення?

# pidof chromium
20809 20790 20788 20786 20783
# echo 'some text' > /proc/20809/fd/0

Відповіді:


51

Програми GUI не читають зі свого стандартного вводу, вони отримують свій вхід з 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
phil294

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.
Janthelme

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
Приємно спробувати, але у мене немає власного Twitter, програмного забезпечення для моніторингу мого провайдера та інших сайтів, які я маю стежити;) Я, мабуть, повинен був згадати про це раніше
burnersk

4
Ви можете вставити цей тег на сторінку за допомогою сценарію користувача. Це може бути менш крихким рішенням, ніж відправлення натискання клавіші до вікна.
шербанг

2

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


Посилання більше не працює.
Antonín Procházka
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.