如何基于窗口位置计算按钮的屏幕坐标
坐标计算逻辑
GetWindowRect返回的元组按顺序对应(窗口左上角屏幕X坐标left, 窗口左上角屏幕Y坐标top, 窗口右下角屏幕X坐标right, 窗口右下角屏幕Y坐标bottom)。
你提到的按钮坐标x:505 y:787如果是相对于窗口左上角的相对坐标,直接用以下公式计算屏幕绝对坐标即可:
按钮屏幕X坐标 = window_rect[0] + 按钮相对X 按钮屏幕Y坐标 = window_rect[1] + 按钮相对Y
代入你给出的示例数值:
- 按钮屏幕X = 237 + 505 = 742
- 按钮屏幕Y = 286 + 787 = 1073
直接把计算出的坐标传给pyautogui.click()即可,窗口移动后只要重新获取window_rect再计算,就能拿到正确的点击位置。
如果你的x:505 y:787是之前窗口固定位置时硬编码的屏幕绝对坐标,可以先算一次相对坐标:
- 先记录你硬编码时窗口的
window_rect值,假设当时的left为old_left、top为old_top - 按钮相对X = 505 -
old_left - 按钮相对Y = 787 -
old_top
之后就可以用上面的通用公式计算任意窗口位置下的按钮坐标。
补充说明
- 如果你的按钮相对坐标是排除了窗口标题栏、边框的客户区相对坐标,需要先用
GetClientRect获取客户区尺寸,再调用ClientToScreen接口将客户区相对坐标转为屏幕绝对坐标,避免窗口边框尺寸带来的偏移。 - 你当前代码里有两处小笔误:
GetWIndowRect拼写错误应为GetWindowRect,none在Python中应为大写的None。
相关内置工具
没有专门做这个坐标转换的内置函数,不过逻辑就是简单的坐标偏移相加,计算量可以忽略。如果你不想自己调用win32接口,也可以用pyautogui配套的pygetwindow库直接获取窗口位置,底层逻辑和你当前的win32调用一致。
内容的提问来源于stack exchange,提问作者Mochi
相关产品推荐
相关产品推荐

