메크로 <-> 로스트아크 작업 전환을 해보자 !! (feat pywinauto)
-
[loop type=post category=diy-software count=5]
- [field title-link] [/loop]
* 경고 *
해당 포스팅은 교육적인 목적입니다. 절대 악용, 남용 하면 아니되옵니다.
안녕하세요 라이프온룸 호그입늬다 ~~!~@!
오늘은 투망과 통발하는 법에 대한 포스팅을 하려 했는데요 ! 사실 생각을 해보니 이거에 대해서 포스팅 하면 너무 제가 메크로 업자같지 않나 ? 라는 생각과 교육적인 목적에도 어긋나서(새로운 라이브러리나 기술이 추가되지 않아요 ! 즉 알고리즘만 잘 생각해 내면 만드실 수 있을 거에요)
그래서 오늘 로스트아크로 작업 전환을 하는 방법에 대해 알아볼게요 !
이게 왜 필요 하냐 키보드, 마우스, 이미지 검출에 대한 매크로를 돌리면 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 도 찾을 수 있지요
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 알고리즘으로 찾아 올게요 !! 긴글 읽으시느라 굉장히 수고 많으셨구요 유익한 정보가 되었으면 좋겠네요 ㅋㅋ
안녕하세요
혹시 특정 핸들러로 키보드&마우스 메세지를 보낼 방법이 있을까요?
창을 내려놓고 메세지를 주고 싶어서요