Отправлять нажатия клавиш в неактивное приложение с графическим интерфейсом, не занимая клавиатуру - PullRequest
18 голосов
/ 08 мая 2019

Как видно из названия, я пытаюсь использовать терминал для отправки команд в виде нажатий клавиш в приложение с графическим интерфейсом, которое свернуто.

Есть много похожих вопросов здесь, в Stack, с некоторыми отличными ответами, но у меня есть, в основном, три проблемы с решениями, которые я видел: большинство решений нуждаются в автоматизированном приложении, чтобы быть активным. Или я не могу нормально использовать клавиатуру во время работы скрипта / процесса. Или, что еще хуже, решение работает только в ОС Windows.

Мне нужно то, что этот человек спросил 2 месяца назад: Отправка нажатий клавиш в определенное окно (в фоновом режиме), но в то же время сделайте что-нибудь еще Но я хочу это на Linux. Я использую Kubuntu 18.10, если это поможет.

xdotool был близок, но я не мог заставить его отправлять команды в определенное окно или PID. Он также использует «мою клавиатуру», поэтому я не могу, например, написать эссе / код / ​​просматривать онлайн, пока работает xdotool. У Pexpect также есть эта последняя проблема.

Похоже, что AutoHotKey будет работать, но это только для Windows, и я пытаюсь не использовать Wine. То же самое с pywin32.

клавиатура (https://github.com/boppreh/keyboard) выглядит неплохо, но не может отправить команду определенному приложению. То же самое с PyAutoGUI.

Я выбрал тег Python, потому что большинство решений, которые я видел, используют Python, но я открыт для любого языка.

1 Ответ

3 голосов
/ 21 мая 2019

Используйте вложенный X-сервер для ввода нажатий клавиш без изменения фокуса или захвата клавиатуры. Подтверждение концепции:

Xephyr -resizeable :13
export DISPLAY=:13
xterm
xdotool type rhabarber

Вложенный X-сервер Xephyr запускается и будет прослушивать локальный X-сокет 13 (тогда как: 0 обычно идентифицирует текущий запущенный X-сервер, но при одновременном запуске нескольких сеансов он может быть выше). Затем мы устанавливаем переменную окружения DISPLAY равной: 13, поэтому любое запускаемое нами приложение X будет подключаться к Xephyr; xterm является нашим целевым приложением здесь. Используя xdotool или любой другой инструмент, мы можем отправлять нажатия клавиш.

Поскольку целевой X-сервер идентифицируется с помощью $DISPLAY, приложения могут запускаться или вводить события, инициированные также из других мест. При необходимости вы также можете запустить облегченный оконный менеджер в Xephyr, например «развернуть» приложение так, чтобы оно заполнило все окно Xephyr.

...