Come inviare i tasti (F5) dal terminale a un programma GUI?


40

Sto usando un Raspberry Pi in combinazione con Chromium (modalità kiosk) per mostrare alcune statistiche. Il Pi non ha una tastiera collegata, quindi ho cercato una soluzione per inviare sequenze di tasti dal terminale al processo Chromium (tab) . L'input normale funziona, ma come posso inviare qualcosa di simile F5(un tasto speciale: aggiornamento del browser) tramite questa soluzione?

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

Risposte:


51

Programmi con interfaccia grafica non leggono dal loro standard input, ottengono il loro ingresso dal server X . Ci sono strumenti per iniettare una sequenza di tasti in una finestra. xdotool è abbastanza comune e conveniente.

Dovrai trovare l'ID della finestra a cui vuoi inviare la sequenza di tasti. Puoi farlo con xdotool.xdotool search --class Chromerestituisce l'elenco degli ID finestra di tutte le finestre di Chrome. Se questo restituisce più di uno, devi scegliere quello che desideri. È possibile utilizzare xdotool search --nameper abbinare il titolo anziché la classe. È inoltre possibile analizzare l'output di wmctrl ed estrarre l'ID finestra desiderato.

Una volta trovato l'ID della finestra giusta, puoi chiamare xdotool per iniettare una sequenza di tasti. Sfortunatamente, molte applicazioni rifiutano eventi sintetici, ovvero sequenze di tasti ed eventi del mouse inviati da un'altra applicazione. Questo è il caso delle versioni attuali di Chrome. È possibile iniettare una sequenza di tasti da un'altra applicazione con un meccanismo diverso, ma ciò richiede che la finestra sia focalizzata. Puoi fare tutto questo con xdotool, ma ciò causerà un rapido sfarfallio della finestra di Chrome e viceversa. Il frammento seguente invia F5alla prima finestra di Chrome (in un ordine un po 'arbitrario).

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

O con le versioni precedenti di xdotool:

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

Ricorda che questo invia F5a quella finestra e spetta al programma decidere cosa farne. In Chrome, questo ricarica la scheda corrente.


4
la --windowidbandiera ora è --window(il comando ti avverte tanto)
Louis Maddox il

2
L' --titleopzione è ora --name(il comando lo avverte fedelmente)
jpaugh

2
la nidificazione è totalmente inutile, dovrebbe essere xdotool search --class Chrome key F5
phil294

1
@Blauhirn L'annidamento era necessario nelle versioni precedenti di xdotool. Ma grazie, ho aggiornato la mia risposta per mostrare anche la sintassi più recente.
Gilles 'SO- smetti di essere malvagio' il

Oh, e dal momento che sto aggiornando questo, Chrome rifiuta gli eventi sintetici al giorno d'oggi. sigh
Gilles 'SO- smetti di essere cattivo'

15

La soluzione suggerita sopra ha usato xdotool in questo modo

 xdotool key --windowid <window> <keystroke>

che non ha funzionato per me. Dopo alcuni esperimenti, sono arrivato a

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

Una volta, che sembrava funzionare, ho definito alcuni script e aggiornato il mio file .lircrc come mostrato qui:

http://pcfellow.com/ClementineRemote.html


Mi chiedo perché il tuo primo esempio non funziona? Sarebbe bello inviare sequenze di tasti a finestre non focalizzate.
Geremia,

1
@Geremia, probabilmente non funziona per il motivo fornito nelle NOTE SENDEVENT nella documentazione di xdotool.
Janthelme l'

4

Ho avuto un caso d'uso simile su un Raspberry Pi con Raspbian Wheezy. Avevo bisogno di ruotare le schede su Chrome utilizzando la modalità kiosk (purtroppo, l'installazione di un'estensione per farlo sul vecchio Chrome non è più ragionevole). L'esempio della risposta accettata ha alcuni errori di battitura o semplicemente non funziona con le mie versioni del software, ecco cosa funziona per me:

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

4

Se stai utilizzando Chromium per visualizzare una pagina web personalizzata e desideri che si aggiorni regolarmente, puoi aggiungere il seguente tag:

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

per aggiornarlo automaticamente ogni 5 secondi (è possibile impostarlo più corto o più lungo se lo si desidera).


2
Bel tentativo ma non possiedo Twitter, il software di monitoraggio del mio ISP e altri siti che devo monitorare;) Probabilmente avrei dovuto menzionarlo prima
burnersk

4
È possibile inserire quel tag nella pagina utilizzando uno script utente. Potrebbe essere una soluzione meno fragile rispetto all'invio di un tasto premuto alla finestra.
Sherbang,

2

Storicamente ho usato Auto Hot Key per fare cose come inviare i tasti premuti, tuttavia non è disponibile su Linux, ma una rapida ricerca su Google rivela che c'è IronAHK ( http://www.ironahk.net/ ) non c'è molto documentazione disponibile ancora, ma potrebbe fare il trucco.


Il collegamento non funziona più.
Antonín Procházka,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.