モニタを増やしたらマウスカーソルが迷子になることが増えてしまいました。対策として、モニタ上の指定した座標にカーソルを持ってくるホットキーを定義しています。
config.py
# 各モニタのタスクバーを除いた矩形をリスト形式で取得する
def get_monitor_areas():
monitors = pyauto.Window.getMonitorInfo()
main_monitor_first = sorted(monitors, key=lambda x : x[2], reverse=True)
non_taskbar_areas = list(map(lambda x : x[1], main_monitor_first))
return non_taskbar_areas
# デフォルトのカーソル位置座標をリスト形式で取得する
def get_default_pos():
pos = []
for mntr in get_monitor_areas():
y = int((mntr[1] + mntr[3]) / 2)
for i in (1, 3):
x = mntr[0] + int((mntr[2] - mntr[0]) / 4) * i
pos.append([x, y])
return pos
# カーソルを指定座標まで移動させる
def set_cursor_pos(x, y):
keymap.beginInput()
keymap.input_seq.append(pyauto.MouseMove(x, y))
keymap.endInput()
# クロージャ生成
def snap_cursor(rightward=True):
pos = get_default_pos()
xs = [p[0] for p in pos]
def _snap():
x, y = pyauto.Input.getCursorPos()
if x not in xs:
set_cursor_pos(*pos[0])
else:
current = xs.index(x)
delta = 3
if rightward:
delta = 1
next_pos = pos[(current+delta) % len(xs)]
set_cursor_pos(*next_pos)
return _snap
keymap_global["O-RCtrl"] = snap_cursor(True)
get_monitor_areas()
でソート処理を挟んでいるのは、(ノートPCの場合)マルチモニタ環境でどのモニタをメインに設定しても pyauto.Window.getMonitorInfo()
がPC本体のモニタを先頭にしたリストを返すからです。
後述の処理でも書くように、常にメインに指定したモニタを先頭として扱いたいので、この段階で並べ替えておきます。
あとは右 Ctrl を押すたびに、モニタの左から1/4の上下中央→右から1/4の上下中央、……といった順に時計回りにカーソル位置が動いていきます(初期位置は必ず左から1/4の点)。
複数台のモニタ間でカーソルが迷子になることがなくなり便利です。
あわせて、現在アクティブなウィンドウの中央にカーソルを持ってくる機能も作ってみました。
config.py
def cursor_to_center():
wnd = keymap.getTopLevelWindow()
wnd_left, wnd_top, wnd_right, wnd_bottom = wnd.getRect()
to_x = int((wnd_left + wnd_right) / 2)
to_y = int((wnd_bottom + wnd_top) / 2)
set_cursor_pos(to_x, to_y)
keymap_global["O-(236)"] = cursor_to_center