如何通过pynput获取应用窗口内点击事件的相对坐标?
实现目标窗口内点击相对坐标的录制与回放
核心思路
用pynput监听全局点击事件,每次触发点击时,通过pywinauto实时获取目标窗口的当前左上角坐标,用绝对点击坐标减去窗口左上角坐标,得到窗口内的相对坐标。回放时再反向计算,用当前窗口位置加上相对坐标得到绝对坐标执行点击——完全不用记录窗口位置,从根源避免窗口移动导致的失效问题。
具体实现步骤
1. 依赖安装
先装好所需工具库:
pip install pynput pywinauto pyautogui
2. 录制相对坐标
from pynput.mouse import Listener, Button from pywinauto import Application import time # 替换成你的目标窗口标题 TARGET_WINDOW_TITLE = "目标应用窗口标题" # 存储录制的相对点击数据 recorded_clicks = [] def on_click(x, y, button, pressed): if pressed: try: # 实时连接目标窗口 app = Application(backend="uia").connect(title=TARGET_WINDOW_TITLE) window = app.window(title=TARGET_WINDOW_TITLE) # 获取窗口当前的左上角坐标和边界 win_rect = window.rectangle() win_left, win_top = win_rect.left, win_rect.top # 只处理目标窗口内的点击 if (win_left <= x <= win_rect.right) and (win_top <= y <= win_rect.bottom): # 计算窗口内的相对坐标 rel_x = x - win_left rel_y = y - win_top # 记录点击类型和相对坐标 recorded_clicks.append({ "button": button.name, "rel_x": rel_x, "rel_y": rel_y }) print(f"已录制:相对坐标({rel_x}, {rel_y}),按钮:{button.name}") except Exception as e: print(f"窗口获取失败:{e}") # 启动监听器,按Ctrl+C停止录制 print("开始录制,按Ctrl+C结束...") with Listener(on_click=on_click) as listener: try: while True: time.sleep(0.1) except KeyboardInterrupt: listener.stop() print("录制结束") print("录制记录:", recorded_clicks)
3. 回放点击
import pyautogui from pywinauto import Application import time def replay_clicks(window_title, clicks): try: app = Application(backend="uia").connect(title=window_title) window = app.window(title=window_title) # 先把窗口调到前台 window.set_focus() time.sleep(0.5) for click in clicks: # 获取当前窗口的最新位置 win_rect = window.rectangle() # 计算当前需要点击的绝对坐标 abs_x = win_rect.left + click["rel_x"] abs_y = win_rect.top + click["rel_y"] # 执行点击操作 pyautogui.click(abs_x, abs_y, button=click["button"].lower()) time.sleep(0.2) # 模拟人工点击的间隔 print("回放完成") except Exception as e: print(f"回放出错:{e}") # 用录制好的记录执行回放 replay_clicks(TARGET_WINDOW_TITLE, recorded_clicks)
关键细节说明
- 实时适配窗口状态:每次点击和回放都会重新获取窗口位置,哪怕窗口中途移动、调整大小,计算出的坐标依然准确。
- 过滤无效点击:只记录目标窗口内的操作,不会误录其他窗口的点击。
- 回放可靠性:回放前会自动将目标窗口置于前台,确保点击位置落在正确窗口内。
内容的提问来源于stack exchange,提问作者Rhys
相关产品推荐
相关产品推荐

