안녕하세요. 지꿀입니다 😀
오늘은 사용자가 윈도우 어플리케이션을 사용할 때, 클릭한 텍스트를 수집하는 코드에 관련한 코드를 작성해보려고 해요.
사용자 클릭 버튼 추적하기
저는 RPA(자동화) 과제를 수행하면서 사용자가 어떤 버튼을 클릭했는지에 대한 정보 수집이 필요했어요. 해당 프로세스는 총 3단계로 나눌 수 있어요.
클릭 추적 프로세스
- pywinauto → 어플리케이션 실행
- pynput → 마우스 클릭 이벤트 감지
- ctypes → 마우스 x, y 좌표 수집
- pywinauto → 과정 3의 x, y 좌표에 위치한 컨트롤러 text 인식
예제 코드
저는 Microsoft사의 Outlook을 대상으로 코드를 짜보았어요.
1. module import
# 앱 실행 및 자동화
from pywinauto import application
import pywinauto
# x, y 좌표 수집
from ctypes.wintypes import tagPOINT
# 클릭 이벤트 감지
from pynput.mouse import Listener, Button
from threading import Timer
2. Outlook 실행
앱을 실행하거나 이미 실행중이라면, 연결해줍니다. 저는 process id를 사용하여 실행중인 Outlook 앱을 연결시켜 주었어요.
app = application.Application(backend="uia").connect(process=1548)
3. on_click() 함수
클릭이 발생할 때마다 좌표를 추적하여 버튼명을 print하는 함수를 작성합니다. 저는 컨트롤러의 Name 값을 출력하도록 작성하였습니다. 간혹 버튼명이 Name이 아닌 Value에 저장되어 있는 경우도 있었어요.
def on_click(x, y, button, pressed):
if pressed and button==Button.left: #왼쪽 마우스 클릭
pos_x = x
pos_y = y
# 컨트롤 element 찾기
elem = pywinauto.uia_defines.IUIA().iuia.ElementFromPoint(tagPOINT(pos_x, pos_y))
element = pywinauto.uia_element_info.UIAElementInfo(elem)
wrapper = pywinauto.controls.uiawrapper.UIAWrapper(element)
print(wrapper.legacy_properties()['Name'])
4. 클릭 추적 실행
아래 코드를 통해 일정 시간동안 클릭 이벤트를 추적하며 클릭하는 컨트롤러의 Name 및 Value를 출력합니다. 저는 10초 동안 수집하도록 t값을 세팅했습니다.
# 10초
t = 10
with Listener(on_click=on_click) as listener:
# 10초동안 동작하도록 설정
Timer(t, listener.stop).start()
listener.join()
실행 결과
위의 코드를 차례대로 실행하고 Outlook에서 [새 이벤트] 클릭 → 이벤트 제목 작성 → [저장] 클릭을 수행해보았습니다.
제가 클릭한 위치에 있는 컨트롤러의 Name을 성공적으로 가져온 것을 확인하실 수 있습니다.
간단한 사용자 행동 추적 코드를 짜보았습니다. 자동으로 행동을 기록할 때 유용히 써먹을 수 있을 거 같아요. 읽어주셔서 감사합니다 🙂