【Python RPA】クリックを検知してマウス位置を取得する(PyAutoGUI、Win32API)

2020.05.14 /

【Python RPA】クリックを検知してマウス位置を取得する(PyAutoGUI、Win32API)

本記事ではRPA(Robotic Process Automation)を作成する際に必要になる、「クリック時のマウス位置の取得方法」について解説しています。

RPAは、記録したユーザーの行動をそのまま行うため、画面のどの位置をクリックしたかの情報が必要になります。

画面サイズが異なっても動作するように、画像認識でRPAを作る方法もありますが、その場合でもマウス位置の取得は必要になります。
(私が作っているRPAプログラムの場合です)

それではRPA開発に必要不可欠な、ユーザーのクリック時のマウス位置を取得する方法について解説いたします。

必要なモジュール

今回の「ユーザーのクリック時のマウス位置の取得」には、ctypesモジュールとPyAutoGUIモジュールを使用します。

ctypesモジュールは共有ライブラリ内の関数(dllなど)を呼び出すのに使用します。

今回で言えば、Windows API(Win32API)を使ってPythonプログラム内でクリック操作を検知するのに使います。

ctypesモジュールの詳しい使い方は下記リンクをご覧ください。

PyAutoGUIモジュールはマウスやキーボードの操作を自動化することができるライブラリです。

マウスを特定の位置(座標)に動かしたり、クリックしたり、キーボード操作して文字入力等が自動操作できます。

PyAutoGUIでできる基本的な操作一覧を以下に記します。

pyautogui.position() 現在のマウスの座標(x,y)を取得
pyautogui.moveTo(x=100, y=100, duration=1) 指定の座標(x=100,y=100)まで、1秒でマウスを移動
pyautogui.click(x=100, y=100, button='left') 指定の座標(x=100,y=100)でマウスを左クリック
pyautogui.doubleClick(x=100, y=100) 指定の座標(x=100,y=100)で、ダブルクリックを行う
pyautogui.sleep(1) 1秒間待機する
pyautogui.typewrite('word', 0.1) 「word」とタイピング(1文字0.1秒)
pyautogui.hotkey('ctrl','a') ショートカットキーの入力で使用。「ctrlキー」と「aキー」を同時入力(文字すべてを選択)

今回はマウスの位置情報を取得することにPyAutoGUIを使用します。

PyAutoGUIは標準モジュールではないので、使うためにはインストールする必要があります。

以下コードをターミナルで実行してください。

pip install pyautogui

それでは次にユーザーの「クリック動作の検知方法」について解説します。

クリック動作の検知(Win32API)

ctypesモジュールを使ってユーザーのクリック動作を検知します。

以下サンプルコードを使って説明します。

import ctypes
try:
    while True:
        if ctypes.windll.user32.GetAsyncKeyState(0x01) == 0x8000:
		### ここにクリック時の動作を記入する ###

except KeyboardInterrupt:
    print('終了')

サンプルコードの先頭でctypesモジュールをインポートします。

while文をtryで囲み、無限ループを中断できるように例外処理を用いります。

Ctrl+Cを押したときにKeyBoardInterrupt例外が発生し処理が終了します。

無限ループ内部では、if文でクリック動作時の判定をします。

判別式はctypes.windll.user32.GetAsyncKeyState(0x01) == 0x8000:です。

マウス位置情報の取得(PyAutoGUI)

ユーザーのクリック検知後の処理について解説します。

PyAutoGUIを使ってクリック時のマウスの現在位置(座標)を取得します。

以下にサンプルコードを記します。

x, y = pyautogui.position()
print(str(x) + ':' + str(y))

マウスの現在位置を取得するのに、pyautogui.position()関数を呼び出しています。

関数を呼び出した瞬間のマウスカーソルのx,y座標をタプルで返します。

変数x,yに座標を格納し、str()関数で整数を文字列に変換しています。

まとめ

クリック時のマウス位置の取得は、RPA開発において必要不可欠な知識です。

これらの知識を応用して、すばらしいRPAを作ってください。