3時間ほどのリサーチの結果をお見せします。
したかったこと
- 今開いているウィンドウの一覧を取得(ウィンドウ名とハンドルも)
- ウィンドウ一覧から名前の部分一致でウィンドウ名を取得
(例:メモ帳のウィンドウは”test.txt メモ帳”という名前だけど、”メモ帳”という単語だけ指定してメモ帳のウィンドウを開く) - 開きたいウィンドウが最小化しててもOK
ウィンドウをアクティブにするのはpyautoguiでクリックするという力業です。
from ctypes.wintypes import HWND
import win32gui,time,win32con
import pyautogui as pgui
#検索するウィンドウの名前(部分一致)
kensaku="メモ帳"
dict={}
found_app=[]
def list_window_names():
def winEnumHandler(hwnd, ctx):
if win32gui.IsWindowVisible(hwnd):
dict[win32gui.GetWindowText(hwnd)]=hex(hwnd)
#print(hex(hwnd), '"' + win32gui.GetWindowText(hwnd) + '"')
win32gui.EnumWindows(winEnumHandler, None)
list_window_names()
print(dict)
for l in dict.keys():
if kensaku not in l:
#print("ないよ")
pass
else:
found_app.append(l)
print(f"{found_app[0]}あったよ")
#検索したウィンドウを開きます
hwnd = win32gui.FindWindow(None,found_app[0]) # windowのハンドルを取得
#最小化していた場合、ステータスを変えます
if win32gui.IsIconic(hwnd):
win32gui.ShowWindow(hwnd,1) # SW_SHOWNORMAL
else:
win32gui.SetWindowPos(hwnd, win32con.HWND_TOPMOST, 0, 0, 0, 0, win32con.SWP_NOMOVE | win32con.SWP_NOSIZE)
time.sleep(1)
#このままじゃウィンドウは表示されるけどアクティブになっていないので、pysutoguiでクリックしてアクティブにする(力業)
(left, top, right, bottom) = win32gui.GetWindowRect(hwnd)
pgui.moveTo(left+60, top + 10)
pgui.click()
#自動化処理 ご自由にどうぞ
#今回はメモ帳にHiと書いてみます
pgui.typewrite("hi")
#このままだとウィンドウが前面固定されているので、前面固定を解除
win32gui.SetWindowPos(hwnd, win32con.HWND_NOTOPMOST, 0, 0, 0, 0, win32con.SWP_NOMOVE | win32con.SWP_NOSIZE)
参考サイト
Win32guiの公式ドキュメント
http://timgolden.me.uk/pywin32-docs/win32gui.html
開いているウィンドウのハンドルを取得する部分はこの動画を参考にしました
コメント