グローバルショートカットを定義する方法 Ctrl+a1 同じキーストロークを送信するAutoKeyを使用 Ctrl+a1 「gnu screen」というタイトルのウィンドウに?そのようなタイトルのウィンドウがない場合、ポップアップウィンドウに「宛先ウィンドウが見つかりませんでした」と表示されます。
Notify-sendを提供するlibnotify-binをインストールします
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+a
トリガーするには: Ctrl+a それから 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スクリプトではありません。同様のセットアップを使用して、メディアPC(mythtv)で1つのリモコンボタンを使用して、アクティブ化、切り替え、および操作を行います。
これらのスクリプトをキーを組み合わせて実行するようにWindowsショートカット/自動キーを設定することは難しく、通常はctrl + aはグローバルに異なります。アクティベーションキーにctrl + f7を使用することにした場合、このスクリプトを呼び出すと、必要な処理が行われます。
これには、xdotoolとlibnotify-binが必要です。これはアクティブウィンドウを「gnu画面」に変更しません。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-binおよび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"
〜/ bin/*スクリプトでu + xをchmodすることを忘れないでください
#!/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");
}
私の頭に浮かぶ最初のことは、あなたがしたいことを2つの部分に分けることです:
希望するタイトルのウィンドウをチェックするbash関数を作成すると、「gnu画面」になり、見つからない場合は「宛先ウィンドウが見つかりませんでした!」というメッセージがポップアップ表示されます。このためには、最初にwmctrl
をインストールする必要があります
Sudo apt-get install wmctrl
これは、PID、タイトル、位置、サイズ、デスクトップ番号などのWindows情報を取得するために使用できるWindowsコントローラーです。次のコードを.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
のマンページをご覧ください。
システム設定を使用して、customshortを定義します。 here Simpleを実行するコマンドとしてfind_window "gnu screen"
を追加してください。キーボードシーケンスは自由に定義できます。
EDIT:ウィンドウが存在する場合、そのウィンドウに切り替わります!それが、if then else
のelse
が行うことです。