【Python】PyAutoGUIでモニタ解像度とマウス座標を正確に取得する

目次

概要

GUI自動化ライブラリ「PyAutoGUI」を使用して、現在の画面サイズ(解像度)とマウスカーソルの現在地座標を取得する方法です。 自動操作スクリプトを作成する際、クリック位置の特定や、画面端の判定を行うための基礎的な実装となります。

仕様(入出力)

  • 入力: なし(実行環境のディスプレイ情報とマウスデバイスの状態を取得)
  • 出力:
    • 画面の幅と高さ(整数)
    • マウスのX座標とY座標(整数)
    • 特定座標が画面内かどうかの判定結果(真偽値)
  • 前提:
    • 外部ライブラリ pyautogui のインストールが必要です。
    • コマンド: pip install pyautogui

基本の使い方

画面全体のサイズと、現在のマウス位置を取得する最も基本的なコードです。

import pyautogui

# 画面サイズの取得
screen_width, screen_height = pyautogui.size()
print(f"画面サイズ: 幅{screen_width}px, 高さ{screen_height}px")

# マウス座標の取得
current_x, current_y = pyautogui.position()
print(f"現在地: X={current_x}, Y={current_y}")

コード全文

画面情報の取得に加え、指定した座標が画面内に存在するかを判定するロジックを含めた実装例です。 例外処理を含め、実用的な構成にしています。

import pyautogui
import sys

def analyze_screen_status():
    """
    現在の画面解像度とマウス位置を取得し、情報を表示します。
    また、特定のターゲット座標が画面範囲内か検証します。
    """
    try:
        # 1. 画面解像度の取得
        # pyautogui.size() は (width, height) の名前付きタプルを返します
        width, height = pyautogui.size()
        
        # 2. 現在のマウス座標を取得
        # pyautogui.position() は (x, y) の名前付きタプルを返します
        x, y = pyautogui.position()
        
        print("--- 画面情報 ---")
        print(f"解像度: {width} x {height}")
        print(f"アスペクト比: {width / height:.2f}")
        
        print("\n--- マウス情報 ---")
        print(f"現在の座標: (X: {x}, Y: {y})")
        
        # 3. 座標の範囲チェック (onScreen)
        # 例として、現在地が画面内にあるか(通常はTrue)、
        # あるいは固定のターゲット座標が画面内にあるかを確認します
        target_x, target_y = 1920, 1080  # テスト用の座標
        
        is_inside = pyautogui.onScreen(target_x, target_y)
        
        print("\n--- 判定結果 ---")
        if is_inside:
            print(f"ターゲット座標 ({target_x}, {target_y}) は画面内に存在します。")
        else:
            print(f"ターゲット座標 ({target_x}, {target_y}) は画面外です。")

    except pyautogui.PyAutoGUIException as e:
        print(f"PyAutoGUIエラーが発生しました: {e}")
    except Exception as e:
        print(f"予期せぬエラー: {e}")

if __name__ == "__main__":
    analyze_screen_status()

カスタムポイント

  • タプルのアンパック
    • size()position() の戻り値はタプルですが、w, h = pyautogui.size() のように変数へ直接代入(アンパック)することで、その後の計算での視認性が向上します。
  • onScreenの活用
    • pyautogui.onScreen(x, y) は、座標が有効範囲内かを True/False で返します。
    • クリック操作を行う前にこのチェックを入れることで、画面外をクリックしようとして発生するエラーを未然に防ぐガード条件として利用できます。

注意点

  1. マルチモニター環境
    • pyautogui.size() は、プライマリモニターの解像度のみを返します。
    • マルチモニター環境ですべての画面領域を扱う場合、セカンダリモニターの座標はプライマリモニターに対する相対位置(マイナス値など)になることがあり、onScreen() の判定が複雑になる場合があります。
  2. OSのスケーリング設定(DPI)
    • WindowsやmacOSで画面の拡大率(125%、150%など)が設定されている場合、物理的な画素数とPyAutoGUIが取得する論理的な座標が一致しないことがあります。
    • 座標がずれる場合は、OS側の設定を確認するか、座標計算に補正値を掛ける必要があります。
  3. フェイルセーフ機能
    • PyAutoGUIはデフォルトで、マウスを画面の四隅(左上など)に素早く移動させると強制停止する「フェイルセーフ」機能が有効になっています。
    • 意図せずスクリプトが止まる場合は座標管理に注意してください。

応用

一定時間ごとにマウス座標を監視し、移動があった場合のみログを出力する簡易ロガーの実装です。

import pyautogui
import time

def monitor_mouse_movement(duration=10):
    """
    指定した秒数だけマウスの動きを監視します。
    """
    print(f"監視を開始します({duration}秒間)...")
    start_time = time.time()
    last_x, last_y = pyautogui.position()

    try:
        while time.time() - start_time < duration:
            current_x, current_y = pyautogui.position()
            
            # 座標に変化があった場合のみ出力
            if (current_x != last_x) or (current_y != last_y):
                print(f"移動検知: ({last_x}, {last_y}) -> ({current_x}, {current_y})")
                last_x, last_y = current_x, current_y
            
            # 負荷軽減のため少し待機
            time.sleep(0.1)
            
    except KeyboardInterrupt:
        print("\n監視を中断しました。")

    print("監視終了")

if __name__ == "__main__":
    monitor_mouse_movement()

まとめ

PyAutoGUIによる画面情報の取得は、自動化スクリプトの基礎です。 size() で環境の境界値を把握し、position()onScreen() を組み合わせて安全な座標操作を行うことが、エラーの少ない安定した自動化への第一歩となります。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

私が勉強したこと、実践したこと、してることを書いているブログです。
主に資産運用について書いていたのですが、
最近はプログラミングに興味があるので、今はそればっかりです。

目次