本記事では、Pythonを使用してWindowsアプリケーションを自動操作する方法を解説します。具体的には、メモ帳を開き、テキスト入力、コピー&ペースト、表示方法の変更、テキストの置換、保存といった操作をpywinautoとpyautoguiライブラリを用いて実装します。
from pywinauto import application
from pywinauto.keyboard import send_keys
import pyautogui
import subprocess
import re
import time
# メモ帳のプロセスIDを取得する関数
def retrieve_process_id(target_app):
cmd = f"tasklist | findstr {target_app}"
process = subprocess.Popen(cmd, shell=True, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
output = process.stdout.readlines()[0].decode()
print(output)
pid_match = re.findall(f"{target_app}.*?(\\d+)", output)
print(f"取得した{target_app}のPID: {pid_match[0]}")
return int(pid_match[0])
# 方法1: アプリケーションを起動し、適切なバックエンドを指定する
#app = application.Application(backend='win32').start('notepad.exe')
# 方法2: 既存のプロセスIDを指定して接続する
app = application.Application().connect(process=retrieve_process_id("notepad"))
# ウィンドウオブジェクトを取得
notepad_window = app['無題 - メモ帳']
print(notepad_window.print_control_identifiers())
# メモ帳にテキストを入力
editor = app['無題 - メモ帊']
editor.type_keys("Python自動化")
editor.type_keys("サンプルプログラム")
editor.type_keys("テストコード")
# 全選択とコピー
send_keys("^a")
send_keys("^c")
# ペースト操作
send_keys("^v")
send_keys("{VK_RETURN}")
send_keys("^v")
send_keys("{VK_RETURN}")
send_keys("^v")
# ホームキーを押す
pyautogui.keyDown('home')
pyautogui.keyUp('home')
# メニュー構造を表示
print(notepad_window.menu())
# メニューを再帰的にリスト表示する関数
def display_menu_items(menu_elements, indent):
"""
メニューを再帰的に表示する
"""
for item in menu_elements.items():
if len(item.text()) > 0:
print(indent + item.text())
if item.sub_menu() is not None:
display_menu_items(item.sub_menu(), " " + indent)
display_menu_items(notepad_window.menu(), "")
# 「ヘルプ」→「についてメモ帳」を選択
notepad_window.menu_select("ヘルプ->についてメモ帳")
send_keys("{VK_RETURN}")
# 表示→ズーム→拡大を4回実行
for _ in range(4):
notepad_window.menu_select("表示->ズーム->拡大")
# 表示→ズーム→デフォルトズームに戻す
notepad_window.menu_select("表示->ズーム->&デフォルトズームに戻す")
# 置換ダイアログを開き、テキストを置換
notepad_window.menu_select("編集->置換(&R)")
pyautogui.write("Python")
pyautogui.press("tab")
pyautogui.write("プログラミング言語")
pyautogui.press("tab")
# タブキーを6回押して「すべて置換」ボタンに移動
for _ in range(6):
pyautogui.press("tab")
pyautogui.press("enter")
pyautogui.press("esc")
# ファイルを保存
notepad_window.menu_select("ファイル->保存(&S)")
time.sleep(1) # ファイル名入力待機
pyautogui.write("python_automation_sample")
pyautogui.press("enter")
notepad.exe 12345 Console 2 35,060 K
取得したnotepadのPID: 12345
コントロール識別子:
メモ帳 - '*無題 - メモ帳' (L189, T54, R1214, B579)
['*無題 - メモ帳', 'Notepad', '*無題 - メモ帳Notepad']
child_window(title="*無題 - メモ帳", class_name="Notepad")
|
| Edit - 'Python自動化サンプルプログラムテストコード\r\nPython自動化サンプルプログラムテストコード\r\nPython自動化サンプルプログラムテストコード' (L197, T105, R1206, B549)
| ['Edit', '*無題 - メモ帳Edit']
| child_window(title="Python自動化サンプルプログラムテストコード\r\nPython自動化サンプルプログラムテストコード\r\nPython自動化サンプルプログラムテストコード", class_name="Edit")
|
| StatusBar - '' (L197, T549, R1206, B571)
| ['*無題 - メモ帳StatusBar', 'StatusBar Windows (CRLF)', 'StatusBar 第 3 行、第 1 列', 'StatusBar', 'StatusBar 100%', 'StatusBar UTF-8']
| child_window(class_name="msctls_statusbar32")
None
<Menu 2689599>
ファイル(&F)
新規作成(&N) Ctrl+N
ウィンドウを新規開く(&W) Ctrl+Shift+N
開く(&O)... Ctrl+O
保存(&S) Ctrl+S
名前を付けて保存(&A)... Ctrl+Shift+S
ページ設定(&U)...
印刷(&P)... Ctrl+P
終了(&X)
編集(&E)
元に戻す(&U) Ctrl+Z
切り取り(&T) Ctrl+X
コピー(&C) Ctrl+C
貼り付け(&P) Ctrl+V
削除(&L) Del
&Bingで検索... Ctrl+E
検索(&F)... Ctrl+F
次を検索(&N) F3
前を検索(&V) Shift+F3
置換(&R)... Ctrl+H
ジャンプ(&G)... Ctrl+G
すべて選択(&A) Ctrl+A
日付/時刻(&D) F5
書式(&O)
自動改行(&W)
フォント(&F)...
表示(&V)
ズーム(&Z)
拡大(&I) Ctrl + プラス
縮小(&O) Ctrl + マイナス
&デフォルトズームに戻す Ctrl+0
ステータスバー(&S)
ヘルプ(&H)
ヘルプの表示(&H)
フィードバックを送信(&F)
についてメモ帳(&A)