You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 15:05:06