파이썬

파이썬 pyautogui와 키보드 후킹을 통한 자동 클릭 매크로

kimy 2021. 2. 24. 19:05

개요

저번에 만들었던 키보드 후킹 클래스를 이용해 매크로 기록을 시작하고 f2를 누르면 자동으로 위치가 순차적으로 기록되며 f4를 누르면 위치종료를 끝내고 매크로를 실행하는 프로그램을 만들어보겠습니다.

키보드 후킹이 어떤건지 모른다면 아래 링크를 참조하세용

yhkim4504.tistory.com/2

 

파이썬 키보드 후킹을 통한 pyautogui 제어

개요 최근에 pyautogui를 통해서 자동으로 클릭하는 매크로 프로그램을 개발중이었는데 생각해보니 마우스가 파이썬으로 계속 제어되고 있는데 어떻게 중단하지? 라는 생각이 들었다. 맨 처음에

yhkim4504.tistory.com

 

후킹코드

import threading
import keyboard
import pyautogui
from time import sleep

class Hook(threading.Thread):
    def __init__(self):
        super(Hook, self).__init__()
        self.daemon = True
        self.event = False
        self.record = False
        
        keyboard.unhook_all()
        keyboard.add_hotkey('f4', print, args=['\nf4 was pressed'])
        
    def run(self):
        print('Hooking Started')
        while True:
            key = keyboard.read_hotkey(suppress=False)
            if key == 'f2':
                self.record = True
            elif key == 'f4':
                self.event = True
                break

저번과 거의 같지만 이번에는 'f2'를 입력하였을때 self.record를 True로 바꿔주는 코드를 추가했습니다.

 

위치기록

def track_pos():
    pos_list = []  # 저장된 위치리스트
    h = Hook()
    h.start()  # 후킹시작
    print('size:', pyautogui.size())
    print('기록을 시작합니다. 기록:F2, 정지:F4', pyautogui.size())
    
    while True:
        position = pyautogui.position()
        if h.event == True:  # F4 입력시 종료
            print('\nTracking 종료')
            break
        if h.record == True:  # F2 입력시 기록
            pos_list.append((position.x, position.y))
            print(' <------ New Pos Recorded')
            h.record = False
            
        print(f'\r{position.x:4}, {position.y:4}', end='')  # 위치표시
        sleep(0.01)
        
    h.join()  # 쓰레드종료시까지 대기
    keyboard.unhook_all()  # 후킹해제
    
    return pos_list
    
pos_list = track_pos()
print('\npos list :', pos_list)

Hook 클래스의 인스턴스를 생성해준후 h.start()로 후킹을 시작합니다.

while문에서는 종료와 기록조건을 지속적으로 추적하며 현재 위치를 업데이트 해줍니다.

'\r' 은 지금 입력하고 있는 줄의 가장 앞쪽으로 커서를 위치시키라는 뜻이므로 줄이 계속 늘어나지 않고

같은 줄에서 지속적으로 값을 표시해주게 됩니다.

이후 F2 입력시 pos_list에 추가하고 F4 입력시 종료하게 됩니다.

Hooking Started
size: Size(width=1920, height=1080)
기록을 시작합니다. 기록:F2, 정지:F4 Size(width=1920, height=1080)
 961,  876 <------ New Pos Recorded
1432,  861 <------ New Pos Recorded
1397,  822 <------ New Pos Recorded
1209,  930 <------ New Pos Recorded
1200,  913
f4 was pressed
1199,  913
Tracking 종료

pos list : [(961, 876), (1432, 861), (1397, 822), (1209, 930)]

실제 출력결과입니다.

 

매크로 실행

def auto_click(pos_list, sleep_time=0):
    h = Hook()
    h.start()
    while True:
        if h.event == True:
            print('Auto Click 종료')
            break
        for x, y in pos_list:
            pyautogui.moveTo(x, y)
            pyautogui.click()
            sleep(sleep_time)
    h.join()
    keyboard.unhook_all()

이후는 간단합니다. 아까 기록한 pos_list를 인자로 받아서 위치로 이동시키고 클릭하는 것을 반복하게 됩니다. 역시 후킹쓰레드를 실행시켜서 F4 입력시 종료되게 했습니다.

 

결론

저번 글에서 만든 Hook 클래스를 이용하여 직접 위치를 입력하지 않고 자동으로 기록 후 매크로를 실행하는 프로그램을 만들어봤습니다. 더 추가할 수 있는건 시간까지 같이 기록해서 실제 기록과 똑같이 작동하게 하는게 있을거 같네요.