Ich versuche, Tastenanschläge über zu senden xdotool
. Das Senden funktioniert jedoch nicht ordnungsgemäß.
Unten finden Sie das Protokoll eines Skripts, das den gesamten Text in Gedit auswählen und kopieren soll (aber stattdessen nichts tut), zusammen mit seiner Ausgabe (erfasst durch Umleiten von stdout und stderr):
+ xdotool getwindowname 29360262
*Unsaved Document 1 - gedit
+ xdotool key --window 29360262 ctrl+a
+ sleep 1
+ xdotool key --window 29360262 ctrl+c
+ sleep 1
Ich habe es mit Thunderbird versucht und das Skript sendet die Schlüssel, aber ohne Modifikatoren (nein Control
, das heißt). Übrigens sind Schlüssel im Skript von "
wie umgeben "ctrl+a"
.
Der Unterschied zwischen Gedit und Thunderbird kann darin bestehen, dass Gedit eine GTK3-Anwendung ist, während Thunderbird eine GTK2-Anwendung zu sein scheint (Firefox, eine GTK3-Anwendung, verhält sich jedoch wie Thunderbird).
xdotool Version 3.20141006.1
Betriebssystem: Debian GNU / Linux 8.1 (Linux-Kernel 3.16.0-4-amd64)
Desktop Manager: GNOME Shell 3.14.4
xbindkeys
dann müssen Sie die Tasten loslassen , die das Skript ausgelöst wird , umxdotool keyup ...
für einen zuverlässigen BetriebAntworten:
Wenn ein Tastatur- oder Mausereignis von einer Anwendung und nicht von einem Eingabeperipheriegerät generiert wird, wird dieses Ereignis als „synthetisch“ markiert. Viele Anwendungen lehnen synthetische Ereignisse ab.
Theoretisch gibt es dafür einen Sicherheitsgrund - Sie können eine Anwendung auf Ihrem X-Display ausführen, jedoch unter einem anderen Konto oder auf einem anderen Computer -, aber X ist so schlecht darin, Anwendungen zu isolieren (es wurde nie dafür entwickelt), dass Sie dies nicht tun sollten Nicht vertrauenswürdige Anwendungen dürfen überhaupt nicht auf Ihr Display zugreifen. Und wenn Sie dies nicht tun, gibt es keinen Grund, synthetische Ereignisse abzulehnen.
Soweit ich weiß, bietet Gtk keine generische Möglichkeit, um zu entscheiden, ob synthetische Ereignisse zugelassen werden sollen. Es liegt an den einzelnen Anwendungen, und ich weiß nicht, was die Standardeinstellung ist, wenn es dem Programmierer egal ist.
Es gibt eine andere Möglichkeit, Eingabeereignisse mit der XTEST-Erweiterung einzufügen. Auf diese Weise injizierte Ereignisse erscheinen genau wie Ereignisse von einem Eingangsperipheriegerät: Sie stammen effektiv von einem „Test“ -Eingangsperipheriegerät. Der Nachteil dieses Ansatzes besteht darin, dass sie wie jedes andere Ereignis an ein Fenster weitergeleitet werden, sodass sie an das Fenster gesendet werden, das den Fokus hat (sofern sie nicht vom Fenstermanager abgefangen werden). Sie können XTEST-Ereignisse mit (ausreichend aktuellen Versionen von) xdotool senden. Dies geschieht, wenn Sie keine Fenster-ID übergeben.
Ja, das ist nervig. Eine Diskussion dieses Problems finden Sie im Selenium-Wiki . Es scheint, dass es eine Möglichkeit gibt, gefälschte Ereignisse über GTK-Signale oder GDK-Ereignisse an eine GTK + -Anwendung zu senden, aber ich weiß nicht, wie das funktioniert.
quelle