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

如何在不同分辨率双屏中让PyAutoGUI的moveTo定位一致?

解决PyAutoGUI跨分辨率定位偏移问题

你的等比例缩放逻辑本身没问题,但定位偏差大概率是系统DPI缩放或NVIDIA缩放模式导致的坐标映射不匹配,以下是具体解决方法:

1. 修正系统DPI感知偏差

Windows默认的显示缩放(如125%、150%)会让PyAutoGUI获取到「逻辑分辨率」而非物理屏幕分辨率,即便通过NVIDIA修改了输出分辨率,进程未开启DPI感知的话,坐标计算仍会偏移。

添加DPI感知代码,获取真实物理分辨率:

import pyautogui
import ctypes

# 让Python进程感知系统DPI,消除逻辑/物理分辨率偏差
user32 = ctypes.windll.user32
user32.SetProcessDPIAware()

# 获取真实物理屏幕分辨率
actual_width = user32.GetSystemMetrics(0)
actual_height = user32.GetSystemMetrics(1)

def scale_positions(x, y, base_width=2560, base_height=1440):
    # 基于真实物理分辨率计算缩放后的坐标
    scaled_x = int(x * actual_width / base_width)
    scaled_y = int(y * actual_height / base_height)
    return scaled_x, scaled_y

pyautogui.moveTo(*scale_positions(1415, 973))

2. 适配NVIDIA非拉伸缩放模式

如果你通过NVIDIA控制面板设置了「保持纵横比」而非「全屏拉伸」,屏幕会出现黑边,此时系统识别的1920x1080仅对应屏幕中间的有效区域,需要先计算黑边偏移量:

import pyautogui
import ctypes

user32 = ctypes.windll.user32
user32.SetProcessDPIAware()
actual_width = user32.GetSystemMetrics(0)
actual_height = user32.GetSystemMetrics(1)
# 你设置的输出分辨率(1920x1080)
output_width, output_height = 1920, 1080

# 计算黑边的偏移量
offset_x = (actual_width - output_width) // 2
offset_y = (actual_height - output_height) // 2

def scale_positions(x, y, base_width=2560, base_height=1440):
    # 先将基准坐标缩放到输出分辨率,再加上黑边偏移
    scaled_x = int(x * output_width / base_width) + offset_x
    scaled_y = int(y * output_height / base_height) + offset_y
    return scaled_x, scaled_y

pyautogui.moveTo(*scale_positions(1415, 973))

3. 验证坐标准确性

可以先打印计算后的坐标,手动对比是否对应预期位置:

target_x, target_y = scale_positions(1415, 973)
print(f"计算后坐标:({target_x}, {target_y})")

内容的提问来源于stack exchange,提问作者user20315684

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 05:42:40