파이썬 pywinauto 윈도우 프로그램 제어하기
파이썬 pywinauto 윈도우 프로그램을 제어하기 위해서는 pywinauto 라이브러리를 사용한다. 윈도우 프로그램을 객체 데이터로 변환하여 버튼, 메뉴 같은 기능들을 제어하는 프로그램을 만들어보려고 했다.
pywinauto 설치하기
.\venv\Scripts\activate
# 가상환경 실행
pip install pywinauto
항상 새로운 라이브러리를 사용할 때는 가상환경에서 설치하여 작업하는 것을 습관을 들이고 있다.
파이썬 pywinauto 함수 및 코드
app = Application(backend="uia").start("파일 경")
# backend 값은 uia 또는 win32 이다.
procs = findwindows.find_elements()
# 프로그램의 속성값을 찾는 함수로 프로그램의 버튼이나 메뉴등 다양한 기능들을 Tree형태로 반환한다.
for proc in procs:
print(f"{proc} / 프로세스 : {proc.process_id}")
# 프로그램을 실행하기 위해서는 process_id를 알아야하는데 현재 실행되고 있는 프로세스의 id값을 찾는데 쓰인다.
# 만약 중간에 새로 실행되는 프로그램이라면 다시 프로세스 리스트를 불러와서 찾는 코드가 필요하다. 아래에 있다.
app 변수에 프로그램의 제작 방식을 설정해주는데 2가지 방식이 있다.
uia : 윈도우의 기본 프로그램과 같이 구형 프로그램들을 제외한 모든 프로그램
win32 : 구형 프로그램들
모르겠을 땐 2가지를 모두 사용해보면 된다.
pywinauto 프로세스 ID 찾는 방법
# 프로세스를 찾아서 연결하는 방법
find_process_id = None
for proc in procs:
if "프로그램 이름" in proc.name:
find_process_id = proc.process_id
break
if find_process_id is None:
print(" 프로세스를 찾을 수 없습니다.")
else:
# 프로세스 ID로 연결
app.connect(process=find_process_id)
dlg = app.window()
# 연결한 프로세스의 객체들을 모두 출력한다.
dlg.print_control_identifiers()
find_process_id 변수에 현재 실행되고 있는 프로세스 중 ‘프로그램 이름’과 일치하는 프로세스가 있다면 process에 찾은 프로세스 ID를 입력한다. 만약 없다면 print(” 프로세스를 찾을 수 없습니다”) 메시지를 반환한다.
이 코드를 이용하면 프로그램 이름을 정확히 알지못하더라도 프로세스 id를 얻을 수 있다.
pywinauto 다음 프로그램으로 연결하는 방법
위에서 찾은 프로세스 ID로 프로그램을 실행했다면 액션을 취하게 된다. 내 경우에는 로그인 버튼을 클릭하는 코드가 필요했고, 로그인을 하게 되면 새로운 프로그램이 켜지는 방식이다.

# 찾은 객체들 중 Button을 누르는 코드
dlg['로그인Button'].click()
# 버튼 이름을 넣어주고 클릭 함수를 연결한다.
예를 들면 배틀넷이라는 프로그램에 로그인을 하고 게임을 실행하면 본격적인 게임이 로딩되는 방식이다. 이럴 땐 다음 프로그램의 프로세스 id를 찾아서 연결하는 코드가 필요하다.
procs = findwindows.find_elements()
mall_management_process_id = None
for proc in procs:
if "쇼핑몰 통합관리 솔루션" in proc.name:
mall_management_process_id = proc.process_id
break
if mall_management_process_id is None:
print("쇼핑몰 통합관리 솔루션 프로세스를 찾을 수 없습니다.")
else:
# 프로세스 ID로 연결
app.connect(process=mall_management_process_id)
print(f"쇼핑몰 통합관리 솔루션 프로세스 ID: {mall_management_process_id}")
dlg = app.window()
내가 만들던 ‘샵마인’이라는 프로그램의 정확한 Title를 찾지못해서 포스팅 초반부에 적혀있는 이름의 일부분을 찾아서 프로세스 ID를 반환하는 코드를 다시 사용했다. 이렇게 되면 로그인 창이 꺼지고 새로운 프로그램이 로딩되면 다시 연결한다.
객체 중 일부 키워드를 찾아서 출력하는 코드
window_obj = dlg.child_window(title="엑셀파일생성(X)", control_type="Button")
# 찾은 window 객체 내부의 버튼 컨트롤 식별자 출력
window_obj.print_control_identifiers()
프로그램에 다양한 객체들이 있을 경우 Tree형태로 반환되는 메세지가 너무 많아진다. 그럴 때에는 객체의 title을 지정하여 원하는 객체만 찾을 수 있다.
pywinauto를 이용하여 샵마인을 제어하는 프로그램을 만들어보려고 했으나 로그인 이후에 쇼핑몰 정보들이 로딩되는데 여기서 얻어오는 객체들의 데이터가 너무 방대하여 찾지 못했다. 다음에는 pyautogui를 이용하여 이미지로 매크로를 만드는 코드로 바꿔볼 예정이다.
copyright@timeseller