Como enviar pressionamentos de tecla (F5) do terminal para um programa GUI?


40

Estou usando um Raspberry Pi em combinação com o Chromium (modo quiosque) para mostrar algumas estatísticas. O Pi não possui um teclado conectado, então procurei uma solução para enviar pressionamentos de tecla do terminal para o processo Chromium (guia) . A entrada normal funciona, mas como envio algo como F5(uma chave especial: atualização do navegador) por meio desta solução?

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

Respostas:


51

Programas gráficos não ler a partir de sua entrada padrão, eles obter a sua entrada a partir do servidor X . Existem ferramentas para injetar um pressionamento de tecla em uma janela. O xdotool é bastante comum e conveniente.

Você precisará encontrar o ID da janela para o qual deseja enviar o pressionamento de tecla. Você pode fazer isso com o xdotool. xdotool search --class Chromeretorna a lista de IDs de janelas de todas as janelas do Chrome. Se isso retornar mais de um, você precisará escolher o que deseja. Você pode usar xdotool search --namepara corresponder no título em vez da classe. Você também pode analisar a saída do wmctrl e extrair o ID da janela desejada.

Depois de encontrar o ID da janela certa, você pode ligar xdotoolpara inserir uma tecla. Infelizmente, muitos aplicativos rejeitam eventos sintéticos, ou seja, pressionamentos de tecla e eventos de mouse enviados por outro aplicativo. É o caso das versões atuais do Chrome. É possível injetar um pressionamento de tecla de outro aplicativo por um mecanismo diferente, mas isso requer que a janela seja focada. Você pode fazer tudo isso com o xdotool, mas isso fará com que o foco passe rapidamente para a janela e para trás do Chrome. O seguinte snippet é enviado F5para a primeira janela do Chrome (em uma ordem um tanto arbitrária).

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

Ou com versões mais antigas do xdotool:

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

Lembre-se de que isso é enviado F5para essa janela e cabe ao programa decidir o que fazer com ela. No Chrome, isso recarrega a guia atual.


4
a --windowidbandeira está agora --window(o comando o avisa tanto) #
43505 Louis Maddox

2
A --titleopção é agora --name(o comando fielmente adverte tanto)
jpaugh

2
a nidificação é totalmente desnecessário, deve ser xdotool search --class Chrome key F5
phil294

11
@Blauhirn O aninhamento era necessário nas versões mais antigas do xdotool. Mas obrigado, atualizei minha resposta para mostrar também a sintaxe mais recente.
Gilles 'SO- stop be evil'

Ah, e como estou atualizando isso, o Chrome rejeita eventos sintéticos hoje em dia. suspiro
Gilles 'SO- stop being evil'

15

A solução sugerida acima usou o xdotool como este

 xdotool key --windowid <window> <keystroke>

o que não funcionou para mim. Depois de algumas experiências, cheguei a

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

Uma vez, que parecia estar funcionando, defini alguns scripts e atualizei meu arquivo .lircrc como mostrado aqui:

http://pcfellow.com/ClementineRemote.html


Eu me pergunto por que seu primeiro exemplo não funciona? Seria bom enviar pressionamentos de teclas para janelas não focadas.
Geremia 25/02

11
@ Geremia, provavelmente não funciona pelo motivo indicado nas SENDEVENT NOTES na documentação do xdotool.
Janthelme

4

Eu tive um caso de uso semelhante em um Raspberry Pi executando o Raspbian Wheezy. Eu precisava girar as guias no Chrome usando o modo quiosque (infelizmente, instalar uma extensão para fazer isso no Chrome antigo não é mais razoável). O exemplo da resposta aceita tem alguns erros de digitação ou simplesmente não funciona com minhas versões de software, eis o que funciona para mim:

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

4

Se você estiver usando o Chromium para exibir uma página da web personalizada e desejar que ela seja atualizada regularmente, poderá adicionar a seguinte tag:

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

para atualizá-lo automaticamente a cada 5 segundos (você pode configurá-lo mais curto ou mais, se desejar).


2
Boa tentativa, mas eu não possuo Twitter, o software de monitoramento do meu ISP e outros sites eu tenho que monitorar;) eu provavelmente deveria ter mencionado isso antes
burnersk

4
Você pode inserir essa tag na página usando um script de usuário. Pode ser uma solução menos frágil do que enviar um pressionamento de tecla para a janela.
amigos estão dizendo sobre sherbang

2

Historicamente, usei o Auto Hot Key para fazer coisas como enviar pressionamentos de tecla, mas isso não está disponível no Linux, mas uma rápida pesquisa no Google revela que existe o IronAHK ( http://www.ironahk.net/ ). documentação disponível ainda, mas pode funcionar.


O link não funciona mais.
Antonín Procházka
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.