Chapter 06

マウスカーソルを指定位置に動かす

AWtnb
AWtnb
2021.12.30に更新

モニタを増やしたらマウスカーソルが迷子になることが増えてしまいました。対策として、モニタ上の指定した座標にカーソルを持ってくるホットキーを定義しています。

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