Wie kann ich Tastatureingaben (F5) vom Terminal an ein GUI-Programm senden?

40

Ich verwende einen Himbeer-Pi in Kombination mit Chrom (Kiosk-Modus), um einige Statistiken anzuzeigen. Der Pi hat keine angeschlossene Tastatur, daher habe ich nach einer Lösung gesucht , um Tastatureingaben vom Terminal an den Chromium (Tab) -Prozess zu senden . Die normale Eingabe funktioniert, aber wie sende ich F5über diese Lösung etwas wie (einen speziellen Schlüssel: Browseraktualisierung)?

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

Antworten:

51

GUI-Programme lesen nicht von ihrer Standardeingabe, sondern erhalten ihre Eingabe vom X-Server . Es gibt Werkzeuge, um einen Tastendruck in ein Fenster einzufügen. xdotool ist ziemlich verbreitet und praktisch.

Sie müssen die Fenster-ID finden, an die Sie den Tastenanschlag senden möchten. Das können Sie mit xdotool machen. xdotool search --class ChromeGibt die Liste der Fenster-IDs aller Chrome-Fenster zurück. Wenn dies mehr als eins ergibt, müssen Sie das gewünschte auswählen. Sie können xdotool search --nameanstelle der Klasse eine Übereinstimmung für den Titel verwenden. Sie können auch die Ausgabe von wmctrl analysieren und die gewünschte Fenster-ID extrahieren.

Sobald Sie die richtige Fenster-ID gefunden haben, können Sie xdotooleinen Tastendruck eingeben. Leider lehnen viele Anwendungen synthetische Ereignisse ab, dh Tastenanschläge und Mausereignisse, die von einer anderen Anwendung gesendet wurden. Dies ist bei aktuellen Chrome-Versionen der Fall. Es ist möglich, einen Tastenanschlag aus einer anderen Anwendung über einen anderen Mechanismus einzugeben, aber dazu muss das Fenster fokussiert sein. All das können Sie mit xdotool tun, aber dadurch flackert der Fokus schnell im Chrome-Fenster und zurück. Das folgende Snippet sendet F5an das erste Chrome-Fenster (in einer etwas willkürlichen Reihenfolge).

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

Oder mit älteren Versionen von xdotool:

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

Denken Sie daran, dass dies F5an dieses Fenster gesendet wird und das Programm entscheiden muss, was damit geschehen soll. In Chrome wird der aktuelle Tab neu geladen.

Gilles 'SO - hör auf böse zu sein'
quelle
4
Die --windowidFlagge ist jetzt --window(der Befehl warnt Sie so sehr)
Louis Maddox
2
Die --titleOption ist jetzt --name(der Befehl warnt genau so)
jpaugh
2
Die Verschachtelung ist völlig unnötig, es sollte sein xdotool search --class Chrome key F5
Phil294
1
@Blauhirn Die Verschachtelung war in älteren Versionen von xdotool notwendig. Aber danke, ich habe meine Antwort aktualisiert, um auch die neuere Syntax anzuzeigen.
Gilles 'SO- hör auf böse zu sein'
Oh, und da ich dies aktualisiere, lehnt Chrome heutzutage synthetische Ereignisse ab. Seufzer
Gilles ‚SO- Anschlag Sein Übel‘
15

Die oben vorgeschlagene Lösung verwendete xdotool wie folgt

 xdotool key --windowid <window> <keystroke>

Das hat bei mir nicht funktioniert. Nach einigem Experimentieren kam ich zu

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

Einmal schien das zu funktionieren, ich definierte einige Skripte und aktualisierte meine .lircrc-Datei wie folgt:

http://pcfellow.com/ClementineRemote.html

Mike
quelle
Ich frage mich, warum Ihr erstes Beispiel nicht funktioniert? Es wäre schön, Tastatureingaben an nicht fokussierte Fenster zu senden.
Geremia
1
@Geremia, es funktioniert wahrscheinlich nicht aus dem Grund, der in den SENDEVENT NOTES in der xdotool-Dokumentation angegeben ist.
Janthelme
4

Ich hatte einen ähnlichen Anwendungsfall auf einem Raspberry Pi mit Raspbian Wheezy. Ich musste Tabs in Chrome im Kiosk-Modus drehen (leider ist es nicht mehr sinnvoll, eine Erweiterung für das alte Chrome zu installieren). Das Beispiel der akzeptierten Antwort enthält einige Tippfehler oder funktioniert einfach nicht mit meinen Softwareversionen. Für mich funktioniert Folgendes:

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

Wenn Sie mit Chromium eine benutzerdefinierte Webseite anzeigen und diese regelmäßig aktualisieren möchten, können Sie ihr das folgende Tag hinzufügen:

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

um es automatisch alle 5 Sekunden zu aktualisieren (Sie können es kürzer oder länger einstellen, wenn Sie möchten).

André Borie
quelle
2
Netter Versuch, aber ich besitze kein Twitter, die Überwachungssoftware meines ISP und andere Websites, die ich überwachen muss;) Ich hätte das wahrscheinlich vorher erwähnen sollen
Burnersk
4
Sie können dieses Tag mit einem Benutzerskript in die Seite einfügen. Könnte eine weniger spröde Lösung sein, als einen Tastendruck ans Fenster zu schicken.
Sherbang
2

Ich habe in der Vergangenheit die automatische Tastenkombination verwendet, um beispielsweise Tastendrücke zu senden. Diese Funktion ist unter Linux jedoch nicht verfügbar. Eine schnelle Google-Suche zeigt jedoch, dass es IronAHK ( http://www.ironahk.net/ ) gibt, für das es nicht viel gibt Dokumentation noch verfügbar, aber es kann den Trick tun.


quelle
Der Link funktioniert nicht mehr.
Antonín Procházka