본문 바로가기
매크로

2부 - 파이썬 마우스 키보드 매크로 만들기. (Creating a python mouse keyboard macro.)

by 매크로제작 2021. 11. 20.
반응형

파이썬으로 RPA 매크로 만들기 강좌 - http://ngmsoftware.com

 

엔지엠소프트웨어

엔지엠 매크로는 복잡한 반복작업을 자동화할 수 있습니다. PC 게임, 모바일 게임을 최적으로 지원하며 모든 PC 프로그램 및 업무에 적용할 수 있습니다.

www.ngmsoftware.com

 

안녕하세요. 엔지엠소프트웨어입니다. [ 파이썬으로 매크로 만들기 1부 ]를 보고 오신 분들은 이제 본격적으로 매크로를 만들 수 있는 환경이 마련된 셈입니다. Visual Studio Code를 실행하고, 터미널에서 pyautogui를 설치해줍니다. 아래 명령을 수행해도 설치가 안된다면 [ 여기 ]를 참고해보세요.

pip install pyautogui

 

아래 코드를 Start.py에 코딩하고, F5를 눌러서 실행 해보세요.

# pyautogui 모듈을 가져옵니다.
import pyautogui
# 마우스를 현재 위치에서 X 방향으로 200, Y 방향으로 200 이동합니다.
pyautogui.move(200, 200)

 

 

마우스가 움직이는걸 확인하셨나요? 마우스가 순간 이동하기 때문에 좀 천천히 이동하도록 변경한 후 다시 실행 해볼께요.

# pyautogui 모듈을 가져옵니다.
import pyautogui
# 마우스를 현재 위치에서 X 방향으로 200, Y 방향으로 200 이동합니다.
# 마지막 인자인 듀레이션 3을 넣으면 좌표로 3초동안 이동합니다.
pyautogui.move(200, 200, 3)

 

 

pyautogui의 move는 현재 위치에서 설정한 X, Y 좌표로 마우스가 이동합니다. 마지막 인자인 Duration(듀레이션)은 마우스의 이동 시간을 나타냅니다. 간단한거지만, 대각선이 아닌 상하로 이동하려면 어떻게 해야 할까요? X값은 0으로 두고 실행해보세요.

# pyautogui 모듈을 가져옵니다.
import pyautogui
# 마우스를 현재 위치에서 Y 방향으로 200 이동합니다.
# 마지막 인자인 듀레이션 3을 넣으면 좌표로 3초동안 이동합니다.
pyautogui.move(0, 200, 3)

 

 

간단하죠? pyautogui의 move는 현재 마우스 좌표에 대해 상대적입니다. 상대적인 좌표 이동은 현재 위치에 영향을 받으므로 원하는 위치로 이동하려면 현재의 마우스 위치를 알아내야 합니다. 그래야 목표 지점으로 가기 위한 절대 좌표를 알 수 있으니까요. 그러면 현재 마우스의 위치는 어떻게 알 수 있을까요?

# pyautogui 모듈을 가져옵니다.
import pyautogui
# position 함수는 마우스의 현재 위치를 반환합니다.
print(pyautogui.position())

 

실행하면 터미널에 현재 마우스의 위치가 출력됩니다. print 는 다른 언어에서 제공하는 Console과 동일합니다. 표준 출력을 담당하죠. 어떤 이유인지 명확하지는 않으나, 콘솔은 데스크에서 입출력이 가능한 장치에서 유래했기 때문에 표준 출력을 담당하는 경우 프린트를 사용하는게 아닌가 생각됩니다. 아무튼, 대부분의 언어가 콘솔에서 출력을 확인하지만, 이또한 Output으로 분리되기도 합니다. 아무튼, 파이참이나 주피터와 같은 파이썬 개발 전용 IDE는 콘솔을 제공합니다.

PS C:\Users\ngmas\Desktop\PythonMacro> & C:/Users/ngmas/AppData/Local/Microsoft/WindowsApps/python3.9.exe c:/Users/ngmas/Desktop/PythonMacro/start.py
Point(x=716, y=367)
PS C:\Users\ngmas\Desktop\PythonMacro> 

 

자~ 우리는 이제 현재 마우스 위치를 알아냈습니다. 그러면 내가 원하는 절대 좌표로 이동하려면 어떻게 해야 할가요? 예로 좌측 상단의 100, 100으로 이동한다고 생각해봅시다. 아주 간단한 산수 문제인데요. 아래와 같이 목표 위치에서 현재 위치를 빼주면 됩니다. 실행하고 확인 해볼까요?

# pyautogui 모듈을 가져옵니다.
import pyautogui
# position 함수는 마우스의 현재 위치를 반환합니다.
x, y = pyautogui.position()
# X 100, Y 100 좌표로 이동하기 위해
# 목표 위치에서 현재 위치를 빼줍니다.
pyautogui.move(100 - x, 100 - y, 3)

 

 

이렇게 절대 좌표로 쉽게 이동할 수 있습니다. 하지만, 더 쉽게 절대 좌표로 이동할 수 있는 함수가 있는데요. 당연한 말이지만~ 대부분은 이 함수를 이용해서 매크로를 만들고 있습니다. 물론, 엔지엠 에디터도 상대 좌표와 절대 좌표로 이동할 수 있는 방법을 제공합니다. 상대 좌표가 필요한 경우는 FPS 게임이나 마우스로 방향을 정하는 MMORPG 게임에서 사용할 수 있습니다. 이외에는 대부분 절대 좌표를 사용하고 있습니다. 절대 좌표로 이동하려면 moveTo 함수를 이용해야 합니다. 아래와같이 코드를 변경하고 실행 해보세요.

# pyautogui 모듈을 가져옵니다.
import pyautogui
# 절대 좌표 100, 100 위치로 마우스를 이동합니다.
pyautogui.moveTo(100, 100, 3)

 

 

특별히 계산하지 않아도 원하는 목표 지점으로 마우스가 이동되는걸 알 수 있습니다. 자 그러면~ 본격적으로 내가 원하는 위치를 클릭해보죠. 일단 클릭할 위치가 어딘지 알아내야 합니다. 이걸 알아내기 위해서는 좌표를 확인해야겠죠? 이건 위에서 설명한 position 함수를 이용해야 합니다. 단순히 마우스 위치만을 출력하면 터미널에 찍히는 좌표를 외워야 하는 불편함이 있습니다. 그래서, 윈도우 이벤트를 후킹해서 클릭하는 경우 멈추도록 해보겠습니다. 아래 코드로 수정하세요.

# pyautogui 모듈을 가져옵니다.
import pyautogui
# 마우스 이벤트를 후킹하기 위해 win32 모듈을 가져옵니다.
import win32api

# 마우스 좌표값을 게속해서 출력하기 위해 와일문을 만듭니다.
while True:
    # win32 api로 마우스의 상태를 가져옵니다.
    down = win32api.GetKeyState(0x01)
    # 마우스 상태가 다운이면 와일문을 탈출합니다.
    if down == 0:
        break
    # 마우스의 현재 좌표를 출력합니다.
    print(pyautogui.position())

 

음~ 개발자가 아니라면 위 코드는 좀 어려울 수 있습니다. 주석을 친절(?)하게 달아두긴 했지만, 일반인이 보기에는 이해하기 어려울겁니다. 아무튼, 실행해보면 어떻게 돌아가는지 확인할수 있는데요. 코드에 적혀 있는 주석과 실제 동작을 비교해보면 어느정도 이해할 수 있을거라고 생각합니다. 만약, 실행이 되지 않는다면 아래 명령을 통해 win32api를 설치 해주세요.

pip install win32api

 

win32api보다 쉽게 후킹할 수 있는 pyHook도 있습니다. pyHook는 윈도우에 설치해야 하므로, 간단하게 win32api를 사용했습니다. 나중에 pyHook를 사용해서 윈도우를 후킹해서 메시지를 조작하는 방법도 알아보도록 할께요. 이번에는 간단하게 마우스를 어떻게 제어하는지에만 집중해서 진행하도록 하겠습니다. F5를 눌러서 실행 해보세요. 그리고, 목표 위치에서 클릭하면 좌표를 확인할 수 있습니다. 아래 동영상에서는 내문서(소심비형)를 클릭하고, 좌표를 확인하고 있습니다.

 

 

마지막에 찍힌 좌표가 X 39, Y 23입니다. 이 위치가 바탕화면의 내문서 폴더 위치입니다. 여기를 클릭해볼까요?

# pyautogui 모듈을 가져옵니다.
import pyautogui
# 내문서를 클릭합니다.
pyautogui.moveTo(39, 23, 3)
pyautogui.click()

 

 

더블 클릭으로 내문서 폴더를 열어봅시다. 코드가 없더라도 여러분들은 이제 직접 할 수 있을겁니다^^;

 

 

이쯤에서~ 마우스 오른쪽 클릭은 어떻게 해야 할까 궁금할겁니다. 아래 코드를 붙여넣기 하고, 실행 해보세요.

# pyautogui 모듈을 가져옵니다.
import pyautogui
# 내문서로 마우스를 이동합니다.
pyautogui.moveTo(39, 23, 3)
# 마우스 오른쪽을 클릭합니다.
pyautogui.click(button='right')

 

 

너무 빠르게 컨텍스트 메뉴가 표시되었다가 사라지네요. 그래도 확인은 되었을거라 생각합니다. 마우스 가운데 버튼(보통은 휠이 여기에 있습니다.)을 클릭하려면 right 대신 middle을 입력하면 됩니다. 코드를 좀 더 간단하게 변경 해볼까요? 아래와같이 클릭에 대한 인자를 직접 설정해도 동일한 결과를 얻을 수 있습니다.

# pyautogui 모듈을 가져옵니다.
import pyautogui
# 내문서를 마우스 오른쪽 클릭합니다.
pyautogui.click(x=39, y=23, duration=3, button='right')

 

 

여러분들도 응용하기 위해서는 syntax(구문, 신택스)를 알아야 합니다. 아래와 같이 해당 함수를 클릭하고 F12를 눌러보세요.

 

 

아마도~ 함수의 정의로 이동되었을겁니다. 내용을 보면 자세하게 설명되어 있고, 어떻게 사용해야 하는지 알려줍니다. IDE에 따라 단축키는 다르지만, 비주얼 스튜디오(Visual Studio) 계열은 F12로 함수 또는 클래스의 정의로 이동할 수 있습니다. 신택스를 볼 수 있으면 개발은 거의 끝났다고 보시면 됩니다. 함수 사용법을 알아냈으니 머리속에 생각한대로 코딩만 하면 되니까요^^ 마지막으로 드래그하는 방법을 알아보죠~ 아래 코드는 내문서 폴더를 가장 마지막으로 이동시킵니다.

# pyautogui 모듈을 가져옵니다.
import pyautogui
# 마우스를 내문서 위치로 이동합니다.
pyautogui.moveTo(39, 23)
# 왼쪽 누른 후 좌표로 듀레이션만큼 이동합니다.
pyautogui.dragTo(39, 500, 3)

 

 

생각보다 쉽죠^^? 여러분들은 이제 마우스 기능을 거의 마스터 했습니다. 아직 알아보지 않은 한가지가 남았는데요. 그건 바로~!!! 스크롤입니다. 스크롤바가 있는 클라이언트가 있으면 쉽게 테스트가 가능한데요. 현재 윈도우 바탕화면에서 스크롤할만한 프로그램이 없습니다. 그래서 건너뛰고 마무리하려는거죠. 이 부분은 직접 scroll 함수의 신택스를 확인해보고 테스트 해보시기 바랍니다. 아마~ 이 글을 읽으시는 분들 모두가 쉽게 성공할거라 생각합니다. 그렇게 어렵지는 않으니까요. 다음에는 키보드를 제어하는 방법에 대해 알아보는 시간을 갖도록 할께요~ 궁금한 내용이 있다면 커뮤니티 > 질문과 답변 게시판에 남겨주시면 확인 후 알려드리도록 하겠습니다.

 

무료 RPA 매크로 다운로드 받기 http://ngmsoftware.com

 

엔지엠소프트웨어

엔지엠 매크로는 복잡한 반복작업을 자동화할 수 있습니다. PC 게임, 모바일 게임을 최적으로 지원하며 모든 PC 프로그램 및 업무에 적용할 수 있습니다.

www.ngmsoftware.com

 

반응형

댓글