【发布时间】:2021-03-02 06:15:42
【问题描述】:
我正在尝试使用SendInput 模拟鼠标输入,但是如果有多个监视器,我需要确定虚拟屏幕宽度,以设置dx 和dy 值,例如:
dx = (x * 65536) / SystemInformation.VirtualScreen.Width;
dy = (y * 65536) / SystemInformation.VirtualScreen.Height;
问题在于显示器显然具有不同的 DPI 值,从而导致虚拟大小不正确。
作为参考,SystemInformation.VirtualScreen.Size 和对GetSystemMetrics(SM_CXVIRTUALSCREEN) 的调用都返回相同的错误值。
我尝试使用GetSystemMetricsForDPI 也没有成功。
【问题讨论】:
-
@Sonts 没有。您正在谈论缩放应用程序。我正在尝试计算标题中所述的虚拟屏幕大小。
-
这些 DPI 虚拟化恶作剧不仅会扩展应用程序的 GUI,还会影响许多操作系统 API,包括 SystemInformation.VirtualScreen.Size 和 GetSystemMetrics。当应用声明它支持每个显示器的 DPI 时,Windows 不会再谎报屏幕尺寸,这些 API 会返回真实的硬件像素。
-
等等,这确实解决了问题,但为什么呢?示例清单状态:
Indicates that the application is DPI-aware and will not be automatically scaled by Windows at higher DPIs.它还指出 WPF 应用程序默认具有此功能,但我实际上是在使用SystemParameters.VirtualScreenWidth的 WPF 应用程序中执行此操作,结果不正确。我会再看看这个。
标签: c# sendinput virtual-screen