Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用多个监视器和不同的DPI查找虚拟屏幕宽度_C#_Sendinput_Virtual Screen - Fatal编程技术网

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
结果不正确。我再看看这个。