我正在开发一个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感知功能。