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

Windows缩放125%及以上时GetCursorPos坐标显示错误的解决方法

解决Windows缩放时光标坐标显示不准确的问题

你的问题出在Windows的DPI缩放机制上:当系统开启缩放(比如125%)时,默认情况下GDI函数(包括GetCursorPos)返回的是逻辑坐标,而非物理屏幕的真实像素坐标。125%缩放时,逻辑坐标会按1/1.25的比例映射到物理坐标,所以你看到2047(2560/1.25-1)、863(1080/1.25-1)这样的数值。

要让坐标显示正确,有两种可靠的解决方式:

方法一:开启程序的DPI感知

让程序直接识别系统DPI,这样GetCursorPos会返回真实的物理坐标。在Windows 10 1607及以上版本,可以用SetProcessDpiAwarenessContext实现;旧版本可改用SetProcessDpiAwareness。

修改后的代码如下:

#include <windows.h>
#include <iostream>

using namespace std;

int main() {
    // 设置进程DPI感知为系统感知,获取真实物理坐标
    SetProcessDpiAwarenessContext(DPI_AWARENESS_CONTEXT_SYSTEM_AWARE);

    POINT p;
    while (GetCursorPos(&p))
    {
        system("cls");
        cout << p.x << "," << p.y;
        Sleep(100);
    }
    return 0;
}

方法二:手动转换逻辑坐标为物理坐标

如果无法修改程序的DPI感知设置,可以先获取系统的DPI缩放比例,再将逻辑坐标换算为物理坐标:

#include <windows.h>
#include <iostream>

using namespace std;

int main() {
    POINT p;
    // 获取系统DPI(默认96为100%缩放)
    UINT dpi = GetDpiForSystem();
    float scale = dpi / 96.0f;

    while (GetCursorPos(&p))
    {
        system("cls");
        // 转换为物理坐标
        int physicalX = static_cast<int>(p.x * scale);
        int physicalY = static_cast<int>(p.y * scale);
        cout << physicalX << "," << physicalY;
        Sleep(100);
    }
    return 0;
}

两种方法都能让你在125%缩放时,光标移到右下角显示正确的2559,1079坐标。优先推荐方法一,因为它更直接,避免手动换算的误差。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 20:20:12