Как определить комбинацию клавиш AutoKey, которая отправляет такое же нажатие клавиши в окно с определенным заголовком

Как определить глобальное сочетание клавиш Ctrl + a 1 с помощью AutoKey, который отправляет то же нажатие клавиши Ctrl + a 1 в окне с заголовком «экран GNU»? Если такого окна нет, должно появиться всплывающее сообщение «Не удалось найти окно назначения».

6
задан 21 June 2015 в 22:49

3 ответа

  1. libnotify-мусорное-ведро Установки, которое обеспечивает, уведомляет - отправляют

    sudo apt-get install libnotify-bin
    
  2. , Создают новый сценарий:

    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"])
    
  3. Установка его горячая клавиша как: Ctrl +

Для инициирования его: Ctrl + тогда 1 (в < 1 секунда)

<час>

Отладка

  1. Запуск X Тестеров События в отдельном окне терминала

    xev -event keyboard
    
  2. Проверка, это - заголовок окна, шоу шахты 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
    
  3. , Изменяют сценарий для предназначения 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")
    
  4. , Если 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 окно, но проверка не находит корректный заголовок. Я получил просто уведомление.

0
ответ дан 21 June 2015 в 22:49

Я думал в том же направлении как "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");
}
1
ответ дан 21 June 2015 в 22:49

Первая вещь, которая прибывает по моему мнению, состоит в том, чтобы повредить то, что Вы хотите сделать в двух частях:

  1. Запись функции удара, которая проверяет на окно, назвала то, что Вы хотите, на Вас это был бы 'экран гну', если не найденный открывается, высказывание сообщения "Не могло бы найти целевое окно!" Для этого необходимо было бы сначала установить 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.

  2. Определяют пользовательский короткое использование Ваших параметров настройки системы. См. здесь Простой, добавляют find_window "gnu screen" как команда для выполнения. Вы определяете последовательности клавиатуры, как Вам нравится.

РЕДАКТИРОВАНИЕ : Если окно будет существовать, оно переключится на то окно! Это - то, что else в эти if then else делает.

0
ответ дан 21 June 2015 в 22:49

Другие вопросы по тегам:

Похожие вопросы: