파이썬 pywinauto 윈도우 프로그램 제어하기

파이썬 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로 프로그램을 실행했다면 액션을 취하게 된다. 내 경우에는 로그인 버튼을 클릭하는 코드가 필요했고, 로그인을 하게 되면 새로운 프로그램이 켜지는 방식이다.

title =”open”, control_type=”Button”
# 찾은 객체들 중 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를 이용하여 이미지로 매크로를 만드는 코드로 바꿔볼 예정이다.

파이썬 pyautogui 윈도우 프로그램 제어하기

파이썬 가상환경 Virtualenv 활성화

copyright@timeseller

Leave a Comment

// Open internal links in same tab