Python PR

【Python】マウスとキーボードを制御・監視する方法

記事内に商品プロモーションを含む場合があります

この記事では、Pythonでマウスとキーボードを制御・監視する方法を解説します。

Pythonで入力デバイスを制御・監視するためには pynputパッケージ を使います。

Linkpynput Package Documentation — pynput 1.7.6 documentation

それでは、実際に pynput を使ってマウスとキーボードを制御・監視してみましょう!

インストール

pynputpip でインストールできます。以下のコマンドをターミナルで実行してください。

pip install pynput

マウスの制御・監視

マウスを制御・監視するには pynput.mouse を使います。

LinkHandling the mouse — pynput 1.7.6 documentation

マウスの制御

マウスを制御するには pynput.mouse.Controller() から行います。

from pynput import mouse

m = mouse.Controller()

ポインターの現在位置

positionプロパティでポインターの現在位置を取得できます。

print(f'現在のポインターの位置: {m.position}')
# 現在のポインタの位置: (793.82666015625, 562.5105590820312)

ポインターのセット

positionプロパティにタプル渡すことで指定した座標にポインターをセットできます。

m.position = (100, 200)

ポインターを相対的に移動

move()メソッドを使うことで現在の位置から相対的にポインターを移動できます。

m.move(200, 200)

プレス

指定されたボタンをプレスする(押し続ける)には、press()メソッドを使います。

m.press(mouse.Button.left)

リリース

指定されたボタンをリリースする(離す)には、release()メソッドを使います。

m.release(mouse.Button.left)

クリック

指定されたボタンをクリックするには、click()メソッドを使います。

m.click(mouse.Button.left, 1)

第二引数countでクリック数を調整できる。以下はダブルクリックとなる。

m.click(mouse.Button.left, 2)

スクロール

スクロールするには、scroll()メソッドを使います。第一引数dxで水平方向のスクロール量、第二引数dyで垂直方向のスクロール量を指定できます。

m.scroll(0, 10)

マウスの監視

マウスを監視するには、pynput.mouse.Listener を使います。

from pynput.mouse import Listener

Listener()にコールバック関数を登録することで対応したイベントを監視することができます。コールバック関数については後述します。

Listener()は、コンテキストマネージャーとして使用可能です。

with Listener() as listener: 
    listener.join()

# コンテキストマネージャーとして実行すると以下と同等になる
listener.start()
try:
    listener.wait()
    with_statements()
finally:
    listener.stop()

Listener()threading.Thread を継承していて、すべてのメソッドをサポートしています。join() もその1つです。→ join()

ブロックしない場合は以下のように実行する。

listener = Listener()
listener.start()

リスナーを停止させるには、pynput.mouse.Listener.stop を呼び出すか、 コールバック関数内で StopException例外 を発生させる、または False を返します。

マウス移動イベントの監視

マウスの移動を監視するには、Listener()on_move引数 に x, y の2つの引数を取る関数を指定します。

from pynput.mouse import Listener

# 移動のコールバック関数
def on_move(x, y):
    print(f'x: {x}, y: {y}')

    # x が 1000 を越えたら...
    if x > 1000:
        # False を返し、リスナーを停止させる
        return False

with Listener(on_move=on_move) as listener: 
    listener.join()

マウスボタンのクリックの監視

マウスボタンのクリックを監視するには、Listener()on_click引数 に x, y, button, pressed の4つの引数を取る関数を指定します。

from pynput.mouse import Listener, Button

# クリックのコールバック関数
def on_click(x, y, button, pressed):
    print(f'pos: ({x}, {y}), button: {button}, pressed: {pressed}')

    # 右クリックを離した際...
    if button == Button.right and not pressed:
        # リスナーを停止する
        return False

with Listener(on_click=on_click) as listener: 
    listener.join()

スクロールの監視

スクロールを監視するには、Listener()on_scroll引数 に x, y, dx, dy の4つの引数を取る関数を指定します。

from pynput.mouse import Listener

# スクロールのコールバック関数
def on_scroll(x, y, dx, dy):
    print(f'pos: ({x}, {y}), scroll: ({dx}, {dy})')

    # 上にスクロールした際...
    if dy > 0:
        # リスナーを停止
        return False


with Listener(on_scroll=on_scroll) as listener: 
    listener.join()

キーボードの制御・監視

キーボードを制御・監視するには pynput.keyboard を使います。

LinkHandling the keyboard — pynput 1.7.6 documentation

キーボードの制御

キーボードを制御するには pynput.keyboard.Controller から行います。

from pynput.keyboard import Controller

k = Controller()

特殊なキー(enter や shiftなど)を指定するには pynput.keyboard.Key を使います。

from pynput.keyboard import Key

Key.enter
Key.shift

通常の文字や数字を指定するには pynput.keyboard.Controller のメソッドの引数に文字列として指定します。

k.press('a')
k.press('A')

プレス

指定されたキーをプレスする(押し続ける)には、press()メソッドを使います。

k.press(Key.enter)

リリース

指定されたキーをリリースする(離す)には、release()メソッドを使います。

k.release(Key.enter)

押している間

pressed()メソッドをコンテキストマネージャーとして使うことで指定したキーを押している間に他の処理を実行することができる。以下では、shift を押している間に a を押して離した。

with k.pressed(Key.shift):
    k.press('a')
    k.release('a')

pressed()メソッドには複数のキーを指定することができます。

with k.pressed(Key.shift, Key.ctrl):
    k.press('a')
    k.release('a')

文字列の入力

type()は、引数に指定された文字列を全て press()release() で入力します。

k.type('abc')

キーボードの監視

キーボードを監視するには、pynput.keyboard.Listener を使います。

from pynput.keyboard import Listener

使い方はマウスのリスナーと同じです。コールバックを登録し、スレッドとして実行するだけです。もちろん、コンテキストマネージャーとして使用可能です。

with Listener() as listener: 
    listener.join()

# コンテキストマネージャーとして実行すると以下と同等になる
listener.start()
try:
    listener.wait()
    with_statements()
finally:
    listener.stop()

ブロックしない方法もマウスのリスナーと同じ。

listener = Listener()
listener.start()

リスナーを停止させるには、pynput.keyboard.Listener.stop を呼び出すか、 コールバック関数内で StopException例外 を発生させる、または False を返します。

キーが押されたかどうかの監視

キーが押されたかどうかを監視するには、Listener()on_press引数 に key引数 を取る関数を指定します。

from pynput.keyboard import Listener

def on_press(key):
    print(f'押されたキー: {key}')

    # 特殊なキーが押された場合にエラーが発生するので例外処理
    try:
        # 押されたキーが q なら...
        if key.char == 'q':
            # リスナーを停止する
            return False
    except:
        pass


with Listener(on_press=on_press) as listener:
    listener.join()

キーが離されたかどうかの監視

キーが押されたかどうかを監視するには、Listener()on_release引数 に key引数 を取る関数を指定します。

from pynput.keyboard import Listener,Key

def on_release(key):
    print(f'離されたキー: {key}')

    # 特殊なキーは pynput.keyboard.Key で指定
    # 離されたキーが ↓ なら...
    if key == Key.down:
        # リスナーを停止する
        return False


with Listener(on_release=on_release) as listener:
    listener.join()

まとめ

この記事では、pynputを使ってマウスとキーボードを制御・監視する方法を解説しました。

キーボードを監視することでショートカット的な機能も作ることができます。

それでは今回の内容はここまでです。ではまたどこかで〜( ・∀・)ノ