Jak wysłać naciśnięcia klawiszy (F5) z terminala do programu GUI?


40

Używam Raspberry Pi w połączeniu z Chromium (tryb kiosku), aby wyświetlić niektóre statystyki. Pi nie ma podłączonej klawiatury, więc szukałem rozwiązania do wysyłania naciśnięć klawiszy z terminala do procesu Chromium (tab) . Normalne wprowadzanie danych działa, ale jak wysłać coś takiego F5(specjalny klucz: odświeżenie przeglądarki) za pomocą tego rozwiązania?

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

Odpowiedzi:


51

Programy GUI nie czyta ze swojego standardowego wejścia, get one swój wkład z serwera X . Istnieją narzędzia do wprowadzania naciśnięcia klawisza do okna. xdotool jest dość powszechny i ​​wygodny.

Musisz znaleźć identyfikator okna, do którego chcesz wysłać naciśnięcie klawisza. Możesz to zrobić za pomocą xdotool. xdotool search --class Chromezwraca listę identyfikatorów okien wszystkich okien Chrome. Jeśli zwraca więcej niż jeden, musisz wybrać ten, który chcesz. Możesz użyć, xdotool search --nameaby dopasować tytuł zamiast klasy. Możesz także przeanalizować dane wyjściowe wmctrl i wyodrębnić żądany identyfikator okna.

Po znalezieniu odpowiedniego identyfikatora okna możesz zadzwonić, xdotoolaby wprowadzić naciśnięcie klawisza. Niestety wiele aplikacji odrzuca zdarzenia syntetyczne, tj. Naciśnięcia klawiszy i zdarzenia myszy wysłane przez inną aplikację. Tak jest w przypadku bieżących wersji Chrome. Możliwe jest wciśnięcie klawisza z innej aplikacji za pomocą innego mechanizmu, ale wymaga to skupienia okna. Możesz to wszystko zrobić za pomocą xdotool, ale spowoduje to, że fokus szybko migocze do okna Chrome iz powrotem. Poniższy fragment kodu jest wysyłany F5do pierwszego okna Chrome (w nieco dowolnej kolejności).

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

Lub ze starszymi wersjami xdotool:

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

Pamiętaj, że wysyła to F5do tego okna i to program decyduje, co z nim zrobić. W Chrome powoduje to ponowne załadowanie bieżącej karty.


4
--windowidflaga jest teraz --window(komenda ostrzega tyle)
Louis Maddox

2
--titleOpcja jest teraz --name(komenda wiernie przestrzega tyle)
jpaugh

2
zagnieżdżanie jest całkowicie niepotrzebne, powinno być xdotool search --class Chrome key F5
phil294

1
@Blauhirn Zagnieżdżanie było konieczne w starszych wersjach xdotool. Ale dzięki, zaktualizowałem swoją odpowiedź, aby pokazać także nowszą składnię.
Gilles „SO- przestań być zły”

Aha, a ponieważ to aktualizuję, Chrome odrzuca obecnie wydarzenia syntetyczne. westchnienie
Gilles „SO- przestań być zły”

15

W powyższym sugerowanym rozwiązaniu zastosowano xdotool

 xdotool key --windowid <window> <keystroke>

co nie działało dla mnie. Po kilku eksperymentach doszedłem do

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

Kiedyś wydawało się, że to działa, zdefiniowałem kilka skryptów i zaktualizowałem mój plik .lircrc, jak pokazano tutaj:

http://pcfellow.com/ClementineRemote.html


Zastanawiam się, dlaczego twój pierwszy przykład nie działa? Byłoby miło wysłać naciśnięcia klawiszy do nieokreślonych okien.
Geremia,

1
@ Geremia, prawdopodobnie nie działa z powodu podanego w UWAGACH NADAWCZYCH w dokumentacji xdotool.
Janthelme,

4

Miałem podobny przypadek użycia na Raspberry Pi z Raspbian Wheezy. Musiałem obracać karty w Chrome w trybie kiosku (niestety instalowanie rozszerzenia w tym celu w starym Chrome nie jest już uzasadnione). Przykład zaakceptowanej odpowiedzi zawiera kilka literówek lub po prostu nie działa z moimi wersjami oprogramowania, oto, co działa dla mnie:

xdotool key --window "$(xdotool search --class Chromium | head -1)" Ctrl+Tab

4

Jeśli używasz Chromium do wyświetlania niestandardowej strony internetowej i chcesz regularnie ją odświeżać, możesz dodać do niej następujący tag:

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

aby automatycznie odświeżać co 5 sekund (możesz ustawić go krócej lub dłużej, jeśli chcesz).


2
Dobra próba, ale nie posiadam Twittera, oprogramowania do monitorowania mojego ISP i innych stron, które muszę monitorować;) Prawdopodobnie powinienem był o tym wspomnieć wcześniej
burnersk

4
Możesz wstawić ten tag na stronę za pomocą skryptu użytkownika. Może to być mniej kruche rozwiązanie niż wysłanie naciśnięcia klawisza do okna.
sherbang

2

Historycznie używałem Auto Hot Key do takich czynności jak wysyłanie naciśnięć klawiszy, jednak nie jest to dostępne w Linuksie, ale szybkie wyszukiwanie w Google ujawnia, że ​​istnieje IronAHK ( http://www.ironahk.net/ ), nie ma wiele dostępna dokumentacja, ale może to załatwić sprawę.


Link już nie działa.
Antonín Procházka
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.