Estou tentando enviar pressionamentos de tecla via xdotool
. No entanto, o envio não funciona corretamente.
Abaixo está o log de um script que deve selecionar todo o texto no Gedit e copiá-lo (mas não faz nada), juntamente com sua saída (capturada ao redirecionar stdout e stderr):
+ xdotool getwindowname 29360262
*Unsaved Document 1 - gedit
+ xdotool key --window 29360262 ctrl+a
+ sleep 1
+ xdotool key --window 29360262 ctrl+c
+ sleep 1
Eu tentei com o Thunderbird, e o script envia as chaves, mas sem modificadores (não Control
, isso é). A propósito, no script, as teclas são cercadas por "
, como "ctrl+a"
.
A diferença entre o Gedit e o Thunderbird pode ser que o Gedit é um aplicativo GTK3, enquanto o Thunderbird parece um aplicativo GTK2 (mas o Firefox, que parece um aplicativo GTK3, se comporta como o Thunderbird).
xdotool versão 3.20141006.1
Sistema operacional: Debian GNU / Linux 8.1 (kernel do Linux 3.16.0-4-amd64)
Desktop Manager: GNOME Shell 3.14.4
xbindkeys
, então você tem que liberar as chaves que acionam seu scriptxdotool keyup ...
para uma operação confiávelRespostas:
Quando um evento de teclado ou mouse é gerado por um aplicativo e não por um periférico de entrada, esse evento é marcado como "sintético". Muitos aplicativos rejeitam eventos sintéticos.
Em teoria, há uma razão de segurança para isso - você pode executar um aplicativo no monitor X, mas em uma conta diferente ou em uma máquina diferente - mas o X é tão ruim em isolar aplicativos (nunca foi projetado para isso) que você não deveria permite que aplicativos não confiáveis acessem sua tela. E se não o fizer, não há razão para rejeitar eventos sintéticos.
Até onde eu sei, o Gtk não oferece uma maneira genérica de decidir se deve permitir eventos sintéticos. Depende de aplicativos individuais e não sei qual é o padrão se o programador não se importar.
Há outra maneira de injetar eventos de entrada, com a extensão XTEST. Eventos injetados dessa maneira parecem exatamente como eventos de um periférico de entrada: efetivamente, eles vêm de um periférico de entrada de "teste". A desvantagem dessa abordagem é que eles são roteados para uma janela da mesma maneira que em qualquer outro evento; portanto, são enviados para a janela que tem o foco (a menos que seja interceptado pelo gerenciador de janelas). Você pode enviar eventos XTEST com (versões suficientemente recentes) do xdotool, é o que faz se você não passar um ID de janela.
Sim, isso é chato. Você pode encontrar uma discussão sobre esse problema no wiki do Selenium . Parece que existe uma maneira de enviar eventos falsos para um aplicativo GTK + por meio de sinais GTK ou eventos GDK, mas não sei como isso funciona.
fonte