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

Win32 Get unscaled Virtual Desktop size in C++

正在处理 C++ 应用程序,试图将鼠标从坐标映射到全屏 windows。

获取鼠标坐标 GetPhysicalCursorPos(&mouse_point); 其中 returns 相对于原点 0,0 的坐标。这导致了问题,因为鼠标正在“越界”显示器,因为 windows 正在缩小它们的大小。例如。它 returns {3839, 1079} 当它位于右下角时,但 Windows 计算总桌面大小为 3200x1080。 (此示例并排放置两个 1080p 显示器,左侧缩放比例为 100%,右侧缩放比例为 150%)

正在检索虚拟桌面大小:

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

但这将返回一个桌面,其中具有更高 DPI 的显示器更小,因此对于 3840x1080 的双 1080p 显示器配置,它 returns 3200x1080(上述配置)。

我试过使用 GetSystemMetricsForDpi 和 96 DPI (100%) 但它 returns 与上面相同:

unsigned int vScreenWidth = GetSystemMetricsForDpi(SM_CXVIRTUALSCREEN, 96 /* 100% scaling*/);
unsigned int vScreenHeight = GetSystemMetricsForDpi(SM_CYVIRTUALSCREEN, 96 /* 100% scaling*/);

尽管明确告诉它强制使用 100% 缩放,但上面的混合缩放示例中也是 returns 3200x1080。

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

注意该应用程序不支持 DPI

感谢@RaymondChen,我能够通过在 GetSystemMetricsForDpi 之前调用 SetThreadDpiAwarenessContext(DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE_V2); 来修复它。

它现在 returns 完整的虚拟桌面大小。