메크로 <-> 로스트아크 작업 전환을 해보자 !! (feat pywinauto)


* 경고 *
해당 포스팅은 교육적인 목적입니다. 절대 악용, 남용 하면 아니되옵니다.

 

안녕하세요 라이프온룸 호그입늬다 ~~!~@!

오늘은 투망과 통발하는 법에 대한 포스팅을 하려 했는데요 ! 사실 생각을 해보니 이거에 대해서 포스팅 하면 너무 제가 메크로 업자같지 않나 ? 라는 생각과 교육적인 목적에도 어긋나서(새로운 라이브러리나 기술이 추가되지 않아요 ! 즉 알고리즘만 잘 생각해 내면 만드실 수 있을 거에요)

그래서 오늘 로스트아크로 작업 전환을 하는 방법에 대해 알아볼게요 ! 

이게 왜 필요 하냐 키보드, 마우스, 이미지 검출에 대한 매크로를 돌리면 window 화면 만을 보고 판단합니다. 현제 window 화면에 크롬 창이 떠있든, 파워포인트가 떠 있든 상관없이요. 이렇게 되면 기대했던 동작이 않되겠죠 ? 우리는 만든 메크로가 우리가 원하는 프로그램에서 돌기를 바라겠죠 ? 

그래서 어떤 액션 혹은 검출이 이루어 지기 전에 현제 윈도우 화면에 어떤프로그램이 떠있는지 확인하고 내가 원하는 프로그램이 떠 있지 않다면 내가 원하는 프로그램으로 변경해 줘야 합니다. 

1. pywinauto

이 동작을 가능하게 해줄 Python 라이브러리가 pywinauto 입니다. Pywinauto 가 어떤 기능을 지원하는지 보죠 

  • 윈도우 GUI 만 지원 
  • 마우스 키보드 액션 
  • 윈도우 다이얼로그 컨트롤 

이 라이브러리를 이용하면 특정 프로그램을 자동으로 열거나 종료할 수 있으며 프로그램에 따라 프로그램 내부를 컨트롤 할 수 있습니다. 메모장으로 예를 든다면 메모장을 열고 특정 내용을 채운 뒤 저장 후 종료하는 과정을 Pywinauto를 이용해 한번에 할 수 있습니다. 관련 내용은 아래 링크를 확인해 보세요 !

https://pywinauto.readthedocs.io/en/latest/contents.html 

여튼 많고 많은 기능중에 우리는 일단 특정 윈도우창을 탑으로 만드는 기능을 살펴보겠습니다. 

2. 필요 라이브러리 설치 

두 가지가 필요합니다. pywinauto, pywin32 

pywinauto 의 경우 저의 경우엔 Pycharm에서 설치가 안되더라고요 .. 그래서 가상환경 활성화 후 CMD 에서 설치 했습니다. 참고로 해당 포스팅은 Python3.6 으로 진행되고 있어요 

pip install pywinauto
pip install pywin32

설치를 다 했으면 기본 테스트를 해볼게요 

from pywinauto.application import Application
app = Application(backend="uia").start("notepad.exe")
app.UntitledNotepad.type_keys("%FX")

pywinauto.py 파일을 만들고 위 코드를 입력한 뒤 실행해 보세요 !!! 메모장이 열릴 겁니다. 

3. 라이브러리 사용 

넵 이제 로스트아크로의 작업 전환 프로그램을 만들어 볼게요 우선 실행중인 프로그램의 title이 필요 합니다. 여기서 title 이란 실행중인 Window Object 의 Access name 입니다. 쉽게 말해서 위도우 작업표시줄 있죠 ? 실행중인 프로그램에 마우스 가따 대면 썸네일이 나오고 title이 나오는데 여기서 title이 access name 입니다. 다르게 확인 하는 방법도 있습니다.

https://github.com/pywinauto/SWAPY

SWAPY 란 프로그램인데요 Visual Studio, Code 의 SPY++, Microsoft SDK 의 inspect.exe 와 비슷한 프로그램입니다. 링크에서 release 탭을 클릭한 뒤 프로그램을 다운로드 한 뒤 실행해 보세요 !

아래와 같이 컴퓨터에서 실행되는 프로그램이 보이고 프로그램을 클릭하면 해당 프로그램의 정보를 볼 수 있습니다. 여기서 access name 도 찾을 수 있지요 

SWAPY 사용법

access name 을 알았으면 코드를 만들어 보겠습니다. 

import pywinauto as pwa
import sys
import time

# 특정 프로그램을 윈도우 Top으로 전환하는 함수
def setFocus(title_reg):
    app = pwa.application.Application()
    # title 이름 정규표현식
    t = title_reg

    print('find title : ' + str(title_reg))

    try:
        # title 을 기반으로 window handle 을 가져옴 
        handle = pwa.findwindows.find_windows(title_re=t)[0]
        # 해당 윈도우 Control을 위해 라이브러리와 연결
        app.connect(handle=handle)
        print('title: ' + str(t) + 'handle: ' + str(handle) + ' Setted')
    except:
        print('No title exist on window ')

    # 어플리케이션의 window를 가져옴 
    window = app.window(handle=handle)

    try:
        # 해당 윈도우를 탑으로 설정 
        window.set_focus()
    except Exception as e:
        print('[error]setFocuse : ' + str(e))

    return window

def setFocusLostaArk():
    # 로스트아크 타이틀의 정규표현식
    t = u'LOST ARK .*'
    return setFocus(t)

if __name__=="__main__":
    setFocusLostaArk()

주석에 설명을 넣었는데요 access_name은 정규표현식으로 전달이 가능합니다. 매우 다행이게도요 .. ㅋㅋ 버전 정보까지 다 전달해야 한다면 업데이트가 될때마다 프로그램을 수정해야 겠죠 ? 하지만 정규 표현식을 사용하면 그럴일을 현저하게 줄일 수 있어요 !

여튼 python 파일을 만들고 위코드를 입력한 뒤 돌려보세요 

로스트아크가 실행중이라면 로스트아크가 윈도우 탑으로 튀어 나올거에요 ! 

위의 빨간색 워닝은 파이참이나 CMD를 관리자 권한으로 실행하면 없어질 겁니다. 

 

넵 오늘은 로스트아크 (특정프로그램)를 윈도우 화면의 탑으로 올리는 방법에 대해 알아 봤습니다. 이걸 응용하면 좀더 안정적이게 특정 프로그램에 원하는 마우스, 키보드 컨트롤을 부여 할 수 있겠죠 !! ㅋㅋㅋ 

포스팅은 여기 까지 입니다. 다음에는 OpenCV 혹은 Astar 알고리즘으로 찾아 올게요 !! 긴글 읽으시느라 굉장히 수고 많으셨구요 유익한 정보가 되었으면 좋겠네요 ㅋㅋ

You may also like...

1 Response

  1. 항상 감사합니다 댓글:

    안녕하세요
    혹시 특정 핸들러로 키보드&마우스 메세지를 보낼 방법이 있을까요?
    창을 내려놓고 메세지를 주고 싶어서요

댓글 남기기

이메일은 공개되지 않습니다.