見出し画像

【Python3】WindowsアプリをRPAで制御することに挑戦する

完全に自分用忘備録。

必要なのはpywinautoとpyautogui

$ pip install pywinauto
$ pip install pyautogui

アプリケーションを起動する

from pywinauto import Application

app = Application(backend="uia").start("C:\\Program Files\\Adobe\\Adobe Photoshop 2022\\Photoshop.exe")

アホなので突然Photoshopを起動しています
exeファイルのあるところのパスを渡せばどんなプログラムでも開けそうですね。

アプリケーションの起動を待つ

アプリが起動する前に次の操作をしてしまうとうまくいかないので、起動が終わるまで待ちます。

while True:
    try:
        app.window(title_re="Adobe Photoshop 2022").wait('exists', timeout=1)
        return
    except:
        raise Exception("フォトショが開けませんでした")

アプリケーションがすでに起動しているか確認する

同じアプリで次々ファイルを処理したいときなど、一旦開いたアプリはいちいち閉じたくないですね。フォトショみたいに起動に時間がかかるソフトならなおさら。

import pygetwindow as gw

if gw.getWindowsWithTitle("Adobe Photoshop 2022"):
    logger.debug("既に開いています")
    return

pygetwindowは、pyautoguiとpywinautoをインストールすると付属しています。
この時、ウィンドウのタイトルは、タスクバーのアプリアイコンにカーソルを合わせたときにぴょこっと表示されるサムネイルのタイトルを取ればOKです。*をワイルドカードとしても使えるっぽいです。

指定のウインドウをアクティブにする

gw.getWindowsWithTitle("Adobe Photoshop 2022")[0].activate()

キーボードを操作する

マウスも操作できるんですが、マウスカーソルの位置を座標で制御するの面倒なので、可能な限りキーボードのショートカットキーで操作を再現できるようにすると制御が楽。

このあたりはこちらのサイトの解説がわかりやすかったです

単キーを押す - press

pyautogui.press("alt")
pyautogui.press("f")

Photoshopならこれでファイルメニューが開きますね。

修飾キーを同時押し - hotkey

pyautogui.hotkey("ctrl", "v")

Ctrl+Vの同時押しなどが実現できます

テキスト入力 - write

現在アクティブになっているテキストエリアにテキストを入力します。
自動でアクティブにならないテキストエリアへの移動方法はまだ調べていない。

pyautogui.write("HOGE")

このとき、一文字ずつ入力する処理をするのでちょっと遅い。
あと、一部の記号がShiftの挙動の問題で違う記号に入れ替わっちゃうことがある。

クリップボードにテキストを一時保存して貼り付ける

テキスト入力する際はこれが速くて簡単そう。ただしクリップボードはがりがり上書きされていく。

import pyperclip
import pyautogui

pyperclip.copy("HOGEHOGE")
pyautogui.hotkey("ctrl", "v")

pyperclipもpyautoguiかpywinautoのどちらかにバーターでついてきます。
(気づいたら入っていたので…)

pyperclipにもpasteコマンドあるんですが、目的のテキストウインドウにはうまく貼り付けられなかったので、ホットキーを使ってCtrl+Vで貼ってしまえ。

とりあえず今回実行したかったことは大体これで実装できそう。

【追記】
予想外のエラーアラートが出たときの対応は要検討ですが、予想されるエラーアラートが出たときの対応はこちら


この記事が気に入ったらサポートをしてみませんか?