C# 使用多个监视器和不同的DPI查找虚拟屏幕宽度
我尝试使用C# 使用多个监视器和不同的DPI查找虚拟屏幕宽度,c#,sendinput,virtual-screen,C#,Sendinput,Virtual Screen,我尝试使用SendInput模拟鼠标输入,但是如果有多个监视器,我需要确定虚拟屏幕宽度,以设置dx和dy值,例如: dx = (x * 65536) / SystemInformation.VirtualScreen.Width; dy = (y * 65536) / SystemInformation.VirtualScreen.Height; 问题是监视器的DPI值明显不同,这导致虚拟大小不正确。 作为参考,SystemInformation.VirtualScreen.Size和调用Ge
SendInput
模拟鼠标输入,但是如果有多个监视器,我需要确定虚拟屏幕宽度,以设置dx
和dy
值,例如:
dx = (x * 65536) / SystemInformation.VirtualScreen.Width;
dy = (y * 65536) / SystemInformation.VirtualScreen.Height;
问题是监视器的DPI值明显不同,这导致虚拟大小不正确。
作为参考,SystemInformation.VirtualScreen.Size
和调用GetSystemMetrics(SM\u CXVIRTUALSCREEN)
返回相同的错误值
我尝试使用
GetSystemMetricsForDPI
也没有成功。默认情况下,Windows将DPI虚拟化应用于所有坐标
如果您有两个显示器,左边是辅助全高清(100%缩放),右边是主4k(200%DPI缩放),屏幕配置API会告诉您桌面有3840x1080像素,辅助像素从[-1920..0],主像素从[0..1920]。要在左监视器的中心模拟鼠标输入,应使用X坐标-960*0x10000/1920=-32768(不带MOUSEEVENTF\u VIRTUALDESK
标志),或960*0x10000/3840=16384(带MOUSEEVENTF\u VIRTUALDESK
标志)
您可以告诉Windows停止在应用程序中干扰DPI
如果您在同一台计算机上执行此操作,屏幕配置的API将告诉您桌面有5760x2160像素,次像素相同,在[-1920..0],主像素[0..3840]。在这种情况下,要将鼠标输入发送到左监视器的中心,应使用X坐标-960*0x10000/3840=-16384,不带
MOUSEEVENTF_VIRTUALDESK
标志,或960*0x10000/5760=10923,带MOUSEEVENTF_VIRTUALDESK
标志。默认情况下,Windows将DPI虚拟化应用于所有坐标
如果您有两个显示器,左边是辅助全高清(100%缩放),右边是主4k(200%DPI缩放),屏幕配置API会告诉您桌面有3840x1080像素,辅助像素从[-1920..0],主像素从[0..1920]。要在左监视器的中心模拟鼠标输入,应使用X坐标-960*0x10000/1920=-32768(不带MOUSEEVENTF\u VIRTUALDESK
标志),或960*0x10000/3840=16384(带MOUSEEVENTF\u VIRTUALDESK
标志)
您可以告诉Windows停止在应用程序中干扰DPI
如果您在同一台计算机上执行此操作,屏幕配置的API将告诉您桌面有5760x2160像素,次像素相同,在[-1920..0],主像素[0..3840]。在这种情况下,要将鼠标输入发送到左监视器的中心,应使用X坐标-960*0x10000/3840=-16384(不带
MOUSEEVENTF\u VIRTUALDESK
标志),或960*0x10000/5760=10923(带MOUSEEVENTF\u VIRTUALDESK
标志)。有帮助吗@不,你说的是缩放应用程序。我正在尝试计算标题中所述的虚拟屏幕大小。这些DPI虚拟化诡计不仅扩展了应用程序的GUI,还影响了许多操作系统API,包括SystemInformation.VirtualScreen.size和GetSystemMetrics。当应用程序声明它支持每监视器DPI时,Windows不再谎报屏幕大小,这些API将返回真正的硬件像素。等等,这确实解决了问题,但为什么?示例清单声明:表示应用程序支持DPI,并且不会由Windows以更高的DPI自动缩放。
它还声明WPF应用程序默认具有此功能,但实际上我正在WPF应用程序中使用系统参数进行此操作。VirtualScreenWidth
结果不正确。我再看看这个,有用吗@不,你说的是缩放应用程序。我正在尝试计算标题中所述的虚拟屏幕大小。这些DPI虚拟化诡计不仅扩展了应用程序的GUI,还影响了许多操作系统API,包括SystemInformation.VirtualScreen.size和GetSystemMetrics。当应用程序声明它支持每监视器DPI时,Windows不再谎报屏幕大小,这些API将返回真正的硬件像素。等等,这确实解决了问题,但为什么?示例清单声明:表示应用程序支持DPI,并且不会由Windows以更高的DPI自动缩放。
它还声明WPF应用程序默认具有此功能,但实际上我正在WPF应用程序中使用系统参数进行此操作。VirtualScreenWidth
结果不正确。我再看看这个。