やりたいこと
- WindowsのGUI操作の自動化をやりたい
- Python環境は作ってあるのでPythonでやりたい
ツール
1つのパッケージで全部やるのは難しいようなのでPyAutoGUIとPyGetWindowを組み合わせてやりたいと思います
どちらもWindows, Mac, Linuxに対応したクロスプラットフォームのパッケージのようですが、今回はWindows11でやっていきます
PyAutoGui
キーボード操作、マウス操作、スクリーンショット取得などが出来るパッケージです
https://pyautogui.readthedocs.io/en/latest/index.html
PyGetWindow
GUIのヴィンドウ一覧の取得や最大化/最小化のほか、ウィンドウを閉じたりアクティベートしたりといった操作ができるパッケージです
https://pygetwindow.readthedocs.io/en/latest/
1.PyAutoGUI
1-1. インストール
pipで入ります
pip install pyautogui
importして使います
import pyatuogui
1-2. マウス操作
1-2-1. マウス移動
座標を指定してマウスポインタを移動することができます
マウスの座標を確認したり、ドラッグアンドドロップの開始点に移動したりでよく使います
pyautogui.moveTo(100, 200)
ゆっくり動かすこともできます
pyautogui.moveTo(100, 200, duration=4)
1-2-2. クリックする
クリックもできます
pyautogui.moveTo(100, 200)
pyautogui.click()
座標を指定してクリックすることもできます
pyautogui.click(100, 200)
1-2-3. ドラッグアンドドロップする
座標を指定してドラッグアンドドロップすることもできます
pyautogui.moveTo(100, 200)
pyautogui.dragTo(400, 400, duration=2)
同じことを相対座標でもできます
pyautogui.moveTo(100, 200)
pyautogui.dragRel(300, 200, duration=2)
右クリックやダブルクリックなどもできます
pyautogui.rightClick(x=moveToX, y=moveToY)
pyautogui.middleClick(x=moveToX, y=moveToY)
pyautogui.doubleClick(x=moveToX, y=moveToY)
pyautogui.tripleClick(x=moveToX, y=moveToY)
1-2-4. スクロール
スクロールもできます
pyautogui.scroll(amount_to_scroll, x=moveToX, y=moveToY)
1-2-5. その他
あまり使わないと思いますがマウスダウン、マウスアップを明示的にやることもできます
マウスダウンしてしまうとキーボード入力ができなくなったり不便なので、例外で止まるときに確実にマウスアップするようにしておいた方が良いと思います
pyautogui.mouseDown(x=moveToX, y=moveToY, button='left')
pyautogui.mouseUp(x=moveToX, y=moveToY, button='left')
1-3. キーボード操作
1-3-1. キーボード入力
キーボード入力もできます
pyautogui.typewrite('Hello world!\n', interval=secs_between_keys)
カーソルキーやENTERキーなどは以下のようにリストにして渡してやることで入力できるようです
pyautogui.typewrite(['a', 'b', 'c', 'left', 'backspace', 'enter', 'f1'], interval=secs_between_keys)
1-3-2. CTRLやALTを押しながらキー入力する
hotkey()に同時押ししたいキーをまとめて渡すとできるようです
pyautogui.hotkey('ctrl', 'c') # ctrl-c to copy
1-3-3. 任意のキー操作をつくる
keyDownとkeyUpも操作できます
僕の環境ではhotkeyが上手く動かなかったのでこちらでやりました
pyautogui.keyDown(key_name)
pyautogui.keyUp(key_name)
1-4. スクリーンショットを撮影
1-4-1. スクリーンショットを撮る
画面全体のスクリーンショットを撮ります
PIL.Imageオブジェクトとして取得できるのでめちゃめちゃ便利です
im = pyautogui.screenshot()
PATHを渡してやると画像を保存してくれます
im = pyautogui.screenshot('hoge.png')
1-4-2. 画面から画像と一致する表示を探す
UI上のボタンなどのデザインが決まってるものを画面内から探して場所を取得することができます
ただ、明度変化があったりすると見つからなくなったりするのでOpenCVのパターンマッチなどを使った方がロバストに作れると思います
box = pyautogui.locateOnScreen('fuga.png')
center = pyautogui.center(box)
pyautogui.click(center)
2. PyGetWindow
2-1. インストール
pipで入ります
pip install pygetwindow
importして使います
import pygetwindow
2-2. Windowを取得する
現在アクティブなウィンドウを取得して後で戻ってこれるようにできます
window = pygetwindow.getActiveWindow()
windows = pygetwindow.getAllWindows()
2-2. Windowの情報を得る
window.title
window.width, window.height
window.top, window.left, window.box, window.center
2-3. Windowを最大化/最小化
window.maximize()
window.minimize()
2-4. アクティベートする
window.activate()
2-5. 閉じる
window.close()
まとめ
何故1つのパッケージにまとまってないのか不思議ではありますが、PyAutoGUIとPyWinAutoを組み合わせればGUI操作はだいたいなんでも出来ると思います。Pythonでやる場合、取得したデータをPandasで加工するのもやりやすいですし、高度なことをやろうと思ったらOpenCVを組み合わせたりできますので、下手なRPAを使うよりも強力なツールとなり得るかもしれません