Я пытаюсь отправить нажатия клавиш через xdotool
. Однако отправка не работает должным образом.
Ниже приведен журнал сценария, который должен выделить весь текст в Gedit и скопировать его (но вместо этого ничего не делает) вместе с его выводом (записывается путем перенаправления как stdout, так и stderr):
+ xdotool getwindowname 29360262
*Unsaved Document 1 - gedit
+ xdotool key --window 29360262 ctrl+a
+ sleep 1
+ xdotool key --window 29360262 ctrl+c
+ sleep 1
Я пробовал с Thunderbird, и скрипт отправляет ключи, но без модификаторов (нет Control
, то есть). Кстати, в скрипте ключи окружены "
, вроде бы "ctrl+a"
.
Разница между Gedit и Thunderbird может заключаться в том, что Gedit является приложением GTK3, тогда как Thunderbird кажется приложением GTK2 (но Firefox, который выглядит как приложение GTK3, ведет себя как Thunderbird).
xdotool версия 3.20141006.1
Операционная система: Debian GNU / Linux 8.1 (ядро Linux 3.16.0-4-amd64)
Менеджер рабочего стола: GNOME Shell 3.14.4
xbindkeys
вы должны отпустить ключи, которые запускают ваш скриптxdotool keyup ...
для надежной работыОтветы:
Когда событие клавиатуры или мыши генерируется приложением, а не периферийным устройством ввода, это событие помечается как «синтетическое». Многие приложения отклоняют синтетические события.
Теоретически, для этого есть причина безопасности - вы можете запустить приложение на своем дисплее X, но под другой учетной записью или на другом компьютере, - но X настолько плох в изоляции приложений (он никогда не был разработан для этого), что вам не следует вообще не позволяйте ненадежным приложениям получать доступ к вашему дисплею. А если нет, то нет причин отвергать синтетические события.
Насколько я знаю, Gtk не предлагает общего способа решить, разрешать ли синтетические события. Это зависит от отдельных приложений, и я не знаю, какое значение по умолчанию, если программисту все равно.
Есть еще один способ ввода входных событий, с расширением XTEST. События, введенные таким образом, выглядят точно так же, как события от входной периферии: по сути, они исходят от «тестовой» входной периферии. Недостатком этого подхода является то, что они направляются в окно так же, как и любое другое событие, поэтому они отправляются в окно, которое имеет фокус (если не перехвачено диспетчером окон). Вы можете отправлять события XTEST с (достаточно недавними версиями) xdotool, это то, что он делает, если вы не передаете идентификатор окна.
Да, это раздражает. Вы можете найти обсуждение этой проблемы в Selenium Wiki . Кажется, что есть способ отправить поддельные события в приложение GTK + через сигналы GTK или события GDK, но я не знаю, как это работает.
источник