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
相关产品推荐
相关产品推荐

