在C++中获取未缩放的虚拟桌面大小(Win32)

3

我正在开发一个C++应用程序,尝试将鼠标从坐标映射到全屏窗口。

使用GetPhysicalCursorPos(&mouse_point);获取鼠标坐标,该函数返回相对于原点0,0的坐标。这会导致问题,因为鼠标会“超出”监视器范围,因为Windows缩小了它们的大小。例如,当鼠标位于右下角时,它返回{3839,1079},但Windows计算的总桌面大小为3200x1080。(此示例中有两个1080p监视器,左侧比例为100%,右侧比例为150%)

使用以下代码检索虚拟桌面大小:

unsigned int vScreenWidth = GetSystemMetrics(SM_CXVIRTUALSCREEN);
unsigned int vScreenHeight = GetSystemMetrics(SM_CYVIRTUALSCREEN);

但是这会返回一个桌面,其中具有更高DPI的显示器更小,因此对于3840x1080的双1080p显示器配置,它返回3200x1080(上面的配置)。
我尝试使用96 DPI(100%)的GetSystemMetricsForDpi,但其返回结果与上述相同。
unsigned int vScreenWidth = GetSystemMetricsForDpi(SM_CXVIRTUALSCREEN, 96 /* 100% scaling*/);
unsigned int vScreenHeight = GetSystemMetricsForDpi(SM_CYVIRTUALSCREEN, 96 /* 100% scaling*/);

尽管明确告知强制使用100%缩放,但以上示例中仍返回3200x1080,这也是我的混合缩放示例的情况。

有没有其他方法可以获取未缩放的虚拟桌面大小?

请注意,此应用程序不具备DPI感知功能


5
你可以调用SetThreadDpiAwarenessContext函数让你的线程暂时变为DPI感知状态,获取未缩放的度量信息,然后恢复原始的DPI感知状态。 - Raymond Chen
感谢@RaymondChen,这修复了GetSystemMetricsForDpi函数,现在返回完整的虚拟大小。 - Space Bear
1个回答

1

感谢 @RaymondChen 的帮助,我通过在调用 GetSystemMetricsForDpi 之前调用 SetThreadDpiAwarenessContext(DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE_V2); 来进行修复。

现在它返回完整的虚拟桌面尺寸。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接