0

我正在尝试使用 模拟鼠标输入SendInput,但是如果有多个监视器,我需要确定虚拟屏幕宽度,以设置dxdy值,例如:

dx = (x * 65536) / SystemInformation.VirtualScreen.Width;
dy = (y * 65536) / SystemInformation.VirtualScreen.Height;

问题是显示器显然具有不同的 DPI 值,这会导致虚拟大小不正确。作为参考,SystemInformation.VirtualScreen.Size和 调用都GetSystemMetrics(SM_CXVIRTUALSCREEN)返回相同的错误值。

我尝试使用GetSystemMetricsForDPI也没有成功。

4

1 回答 1

2

默认情况下,Windows 将 DPI 虚拟化应用于所有坐标。

如果您有 2 台显示器,左侧为 100% 缩放的辅助 FullHD,右侧为 200% DPI 缩放的主 4k,屏幕配置的 API 会告诉您桌面有 3840x1080 像素,第二个来自 [-1920 . . 0],第一个 [0 .. 1920]。要在左显示器的中心模拟鼠标输入,您应该使用 X 坐标 -960 * 0x10000 / 1920 = -32768 不带MOUSEEVENTF_VIRTUALDESK标志,或 960 * 0x10000 / 3840 = 16384 带MOUSEEVENTF_VIRTUALDESK标志

您可以使用 manifest告诉 Windows 停止在您的应用程序中使用 DPI 。

如果您在同一台计算机上执行此操作,屏幕配置 API 会告诉您桌面有 5760x2160 像素,第二个是相同的,在 [-1920 .. 0 ],第一个 [0 .. 3840]。在这种情况下,要将鼠标输入发送到左侧显示器的中心,您应该使用 X 坐标 -960 * 0x10000 / 3840 = -16384 不带MOUSEEVENTF_VIRTUALDESK标志,或 960 * 0x10000 / 5760 = 10923 带MOUSEEVENTF_VIRTUALDESK标志。

于 2021-03-02T08:05:51.807 回答