Как определить глобальное сочетание клавиш Ctrl kbd> + a kbd> 1 kbd> с помощью AutoKey, который отправляет то же нажатие клавиши Ctrl kbd> + a kbd> 1 kbd> в окне с заголовком «экран GNU»? Если такого окна нет, должно появиться всплывающее сообщение «Не удалось найти окно назначения».
libnotify-мусорное-ведро Установки, которое обеспечивает, уведомляет - отправляют
sudo apt-get install libnotify-bin
, Создают новый сценарий:
import time
import subprocess
#no need
#keyboard.release_key("<ctrl>")
# wait_for_keypress does not return any thing to distinguish between target key pressed or timeout reached.
# So if time is less than the timeout then it was key press.
start_time = time.time()
keyboard.wait_for_keypress("1", timeOut=1)
if (time.time()-start_time < 0.9):
time.sleep(0.2)
window.activate("gnu screen")
time.sleep(0.1)
active_title = window.get_active_title()
# if it doesn't get same title, then no window titled as gnu screen
# it sends a notify message otherwise send the key sequence.
if (active_title == "gnu screen"):
keyboard.press_key("<ctrl>")
keyboard.send_key("a")
keyboard.release_key("<ctrl>")
keyboard.send_key("1")
else:
subprocess.Popen(['notify-send', "Couldn't find destination window"])
Установка его горячая клавиша как: Ctrl +
Для инициирования его: Ctrl + тогда 1 (в < 1 секунда)
<час>Запуск X Тестеров События в отдельном окне терминала
xev -event keyboard
Проверка, это - заголовок окна, шоу шахты Event Tester
$ wmctrl -l
0x03000012 -1 N/A Desktop — Plasma
0x030000c1 -1 N/A Desktop — Plasma
0x0300001b -1 N/A Plasma
0x06a00098 0 PC User User - Ask Ubuntu - Mozilla Firefox
0x01a00067 0 N/A user : screen
0x01a000cd 0 N/A user : xev
0x04600001 0 N/A Event Tester
0x01e0015d 0 PC AutoKey
, Изменяют сценарий для предназначения Event Tester
окно.
import time
import subprocess
start_time = time.time()
keyboard.wait_for_keypress("1", timeOut=1)
if (time.time()-start_time < 0.9):
time.sleep(0.2)
window.activate("Event Tester")
time.sleep(0.1)
keyboard.press_key("<ctrl>")
keyboard.send_key("a")
keyboard.release_key("<ctrl>")
keyboard.send_key("1")
, Если xev
получает сочетание клавиш. Его вывод должен быть некоторой вещью, подобной:
KeyPress event, serial 34, synthetic NO, window 0x4600001,
root 0xb2, subw 0x0, time 55057700, (1053,140), root:(945,303),
state 0x0, keycode 105 (keysym 0xffe4, Control_R), same_screen YES,
XLookupString gives 0 bytes:
XmbLookupString gives 0 bytes:
XFilterEvent returns: False
KeyPress event, serial 34, synthetic YES, window 0x4600001,
root 0xb2, subw 0x0, time 0, (1,1), root:(1,1),
state 0x0, keycode 38 (keysym 0x61, a), same_screen YES,
XLookupString gives 1 bytes: (61) "a"
XmbLookupString gives 1 bytes: (61) "a"
XFilterEvent returns: False
KeyRelease event, serial 35, synthetic YES, window 0x4600001,
root 0xb2, subw 0x0, time 0, (1,1), root:(1,1),
state 0x0, keycode 38 (keysym 0x61, a), same_screen YES,
XLookupString gives 1 bytes: (61) "a"
XFilterEvent returns: False
KeyRelease event, serial 35, synthetic NO, window 0x4600001,
root 0xb2, subw 0x0, time 55057701, (1053,140), root:(945,303),
state 0x4, keycode 105 (keysym 0xffe4, Control_R), same_screen YES,
XLookupString gives 0 bytes:
XFilterEvent returns: False
KeyPress event, serial 35, synthetic YES, window 0x4600001,
root 0xb2, subw 0x0, time 0, (1,1), root:(1,1),
state 0x0, keycode 10 (keysym 0x31, 1), same_screen YES,
XLookupString gives 1 bytes: (31) "1"
XmbLookupString gives 1 bytes: (31) "1"
XFilterEvent returns: False
KeyRelease event, serial 35, synthetic YES, window 0x4600001,
root 0xb2, subw 0x0, time 0, (1,1), root:(1,1),
state 0x0, keycode 10 (keysym 0x31, 1), same_screen YES,
XLookupString gives 1 bytes: (31) "1"
XFilterEvent returns: False
Примечание, я удалил if
условие проверить активный заголовок. Сценарий активирует/повышает xev окно, но проверка не находит корректный заголовок. Я получил просто уведомление.
Я думал в том же направлении как "Mostafa Najafiyazdi", и я использовал его функцию wmctrl в качестве основы для первой версии сценария функции с некоторыми модификациями.
Это не автоключевое конкретный и как таковой, это не сценарий Python. Я использую подобную установку, чтобы активировать, переключить и сделать некоторый материал на моем ПК медиа (mythtv) с единственной remotecontrol кнопкой.
Установка окон, shortcut/autokey для выполнения их, пишет сценарий с объединенными ключами, является трудным, и ctrl+a - обычно глобально что-то другое. Если Вы решаете использовать что-то ctrl+f7 для ключа активации, то вызов этого сценария должен сделать то, что Вы хотите.
Этот requies xdotool и libnotify-мусорное-ведро. Это не изменит активное окно на "экран гну", видеть, прокомментировал раздел для изменения на ту же функциональность как с activate_window_and_send_keys сценарием.
~/bin/focus_window_and_send_keys "gnu screen" "ctrl+a+1"
И сценарий:
#!/bin/bash
## copy these files to ~/bin = (~ = is your home directory)
### finding window and keys
## requires xdotool
### notify
## libnotify-bin
# Usage:
# ~/bin/focus_window_and_send_keys "window title" "keys" "morekeys" ...
# ~/bin/focus_window_and_send_keys "gnu screen" "ctrl+a+1"
title=${1:-NOT_FOUND_EMPTY_TITLE}
shift
## get current window
CURWIN=$(xdotool getactivewindow)
TARGETWIN=$(xdotool search --name "$title" | head -n 1)
if [ -z $TARGETWIN ]; then
notify-send -i face-crying "Can't find specified window!"
else
## use this to activate window
#xdotool windowactive "$TARGETWIN"
## changes focus, does not change to the window on display
xdotool windowfocus "$TARGETWIN"
## send keys if window was found
for keypress in "$@"
do
xdotool key --window "$TARGETWIN" "$keypress"
done
fi
## comment next line if focus should stay with activated window
xdotool windowfocus "$CURWIN"
Моя первая версия потребовала их и функциональна (ниже), но использует дополнительную обертку и нужна в окне, чтобы быть активной. версия xdotool не требует этого.
Это требует xautomation libnotify-мусорного-ведра и wmctrl
это - ~/bin/activate_window_and_send_keys scipt, Чтобы сделать то, что Вы хотите от cmdline, Вы назвали бы это с
# this is press ctrl, a, 1, release ctrl
~/bin/activate_window_and_send_keys "gnu screen" "ctrl+a+1"
# this is press ctrl, a, release ctrl, 1
~/bin/activate_window_and_send_keys "gnu screen" "ctrl+a" "1"
Помните к chmod u+x на Вашем ~ / мусорное ведро /* сценарии
#!/bin/bash
## copy these files to ~/bin (~ = is your home directory)
### finding window
## requires wmctrl
### notify
## libnotify-bin
### tool to send keypresses
## requires xautomation
# Usage:
# ~/bin/activate_window_and_send_keys "window title" "keys" "morekeys" ...
# ~/bin/activate_window_and_send_keys "gnu screen" "ctrl+a+1"
export PATH=$PATH:~/bin
## helper function to find correct window
## modified version of Mostafa Najafiyazdi answer
## http://askubuntu.com/a/637897/41757
function find_window_and_activate_window {
# Get the list of all windows
# and select the line containing a substring given as
# an argument to the script
title=$1
window_found=`wmctrl -l | grep "$title" | awk '{print $3}'`
# If nothing is found, echo a message
if [ -z "$window_found" ]; then
notify-send -i face-crying "Can't find specified window!"
return -1
else
wmctrl -a "$title"
fi
}
title=${1:-NOT_FOUND_EMPTY_TITLE}
shift
echo "$title"
find_window_and_activate_window "$title" && {
## send keys if window was found
for keypress in "$@"
do
sendkey "$keypress"
done
}
Это - ~/bin/sendkey, Это - просто обертка вокруг xte для упрощения xte синтаксиса
#!/usr/bin/perl
my @keys=@ARGV;
for my $key (@keys) {
my @keycomb=split(/\+/, $key);
my $k = pop(@keycomb);
#print "$k\n";
my $modup = "";
my $moddown = "";
my $press = " 'key $k' ";
for my $m (@keycomb) {
$m =~ s/ctrl/Control_L/gi;
$m =~ s/alt/Alt_L/gi;
$m =~ s/shift/Shift_L/gi;
$moddown = $moddown.' "keydown '.$m.'"';
$modup = ' "keyup '.$m.'"'.$modup;
}
system("xte $moddown $press $modup");
}
Первая вещь, которая прибывает по моему мнению, состоит в том, чтобы повредить то, что Вы хотите сделать в двух частях:
Запись функции удара, которая проверяет на окно, назвала то, что Вы хотите, на Вас это был бы 'экран гну', если не найденный открывается, высказывание сообщения "Не могло бы найти целевое окно!" Для этого необходимо было бы сначала установить wmctrl
sudo apt-get install wmctrl
, Это - контроллер окон, который можно использовать для получения информации окон включая ее PID, заголовок, положение, размер, настольное число, и т.д. Добавьте следующий код в Вашем .bash_aliases
:
function find_window {
# Get the list of all windows
# and select the line containing a substring given as
# an argument to the script
title=$1
window_found=`wmctrl -l | grep $title | awk '{print $3}'`
# If nothing is found, echo a message
if [ -z "$window_found" ]; then
notify-send -i face-crying "Can't find specified window!"
else
wmctrl -a $1
fi
}
можно измениться, как уведомление похоже. Просто см. страницу справочника для notify-send
.
Определяют пользовательский короткое использование Ваших параметров настройки системы. См. здесь Простой, добавляют find_window "gnu screen"
как команда для выполнения. Вы определяете последовательности клавиатуры, как Вам нравится.
РЕДАКТИРОВАНИЕ : Если окно будет существовать, оно переключится на то окно! Это - то, что else
в эти if then else
делает.