`xdotool` не отправляет ключи


8

Я пытаюсь отправить нажатия клавиш через 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


1
если вы используете его, xbindkeysвы должны отпустить ключи, которые запускают ваш скрипт xdotool keyup ...для надежной работы
grabantot

Ответы:


7

Когда событие клавиатуры или мыши генерируется приложением, а не периферийным устройством ввода, это событие помечается как «синтетическое». Многие приложения отклоняют синтетические события.

Теоретически, для этого есть причина безопасности - вы можете запустить приложение на своем дисплее X, но под другой учетной записью или на другом компьютере, - но X настолько плох в изоляции приложений (он никогда не был разработан для этого), что вам не следует вообще не позволяйте ненадежным приложениям получать доступ к вашему дисплею. А если нет, то нет причин отвергать синтетические события.

Насколько я знаю, Gtk не предлагает общего способа решить, разрешать ли синтетические события. Это зависит от отдельных приложений, и я не знаю, какое значение по умолчанию, если программисту все равно.

Есть еще один способ ввода входных событий, с расширением XTEST. События, введенные таким образом, выглядят точно так же, как события от входной периферии: по сути, они исходят от «тестовой» входной периферии. Недостатком этого подхода является то, что они направляются в окно так же, как и любое другое событие, поэтому они отправляются в окно, которое имеет фокус (если не перехвачено диспетчером окон). Вы можете отправлять события XTEST с (достаточно недавними версиями) xdotool, это то, что он делает, если вы не передаете идентификатор окна.

xdotool windowactivate 29360262
xdotool key ctrl+a ctrl+c

Да, это раздражает. Вы можете найти обсуждение этой проблемы в Selenium Wiki . Кажется, что есть способ отправить поддельные события в приложение GTK + через сигналы GTK или события GDK, но я не знаю, как это работает.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.