gpt4 book ai didi

c# - 具有不同缩放比例的监视器会在屏幕边界之间产生间隙

转载 作者:太空宇宙 更新时间:2023-11-03 15:27:38 24 4
gpt4 key购买 nike

我正在开发 WPF/Winforms 混合应用程序。我们有一个 winforms 窗口,用户可以在其中选择该窗口将使用的显示器,然后定位和缩放窗口,使其占据整个显示器。

我们遇到了一个奇怪的 Windows 问题。我们使用 Screen.AllScreens 获取屏幕的边界,这些边界用于将我们的窗口捕捉到屏幕。但是,我们发现当不同显示器上的缩放设置不同时,显示器之间会存在实际间隙。

例如,我有一个 3 显示器系统,其中显示器 3 设置为 100%,显示器 1 和 2 设置为 125%。系统对话框看起来像这样(没有间隙)。 enter image description here

我们有一个应用程序内可视化,显示 Screen.AllScreens 返回的内容作为每个监视器的边界,这是它的样子 enter image description here

这里是每台显示器的屏幕坐标打印输出

\\.\DISPLAY1: {X=0,Y=0,Width=2048,Height=1536}
\\.\DISPLAY3: {X=-2400,Y=561,Width=2400,Height=1350}
\\.\DISPLAY2: {X=2560,Y=0,Width=2048,Height=1536}

从数字来看,display 2的x坐标似乎是2560,因为它试图给display 1的2048 width * 125% = 2560留出空间。不过,这个差距似乎只存在于不好的坐标作为spanning跨过此间隙的窗口不会隐藏窗口的一部分。更奇怪的是,打印输出显示显示器 3 的尺寸为 2400x1350,比其实际尺寸 1920x1080 大 125%。

长话短说,我知道 Screen.AllScreens 是一个 winforms 调用,也许有点过时了。是否有更好的方法来获取不受缩放影响的屏幕坐标,或者如果我检测到屏幕之间存在间隙,我是否只是坚持警告用户?

最佳答案

通知操作系统您的应用程序是 dpiAware在调用 Application.Run() 方法之前,如下例所示。这样做会自动将 Screen[] 的分辨率结果设置为显示器的原始分辨率,而不是缩放后的数字。

但是,用户仍然可以将他们的屏幕设置为偏移一个间隙。我有几个显示器,其中一个是故意放在我身边的。

static class Program
{
[System.Runtime.InteropServices.DllImport("user32.dll")]
private static extern bool SetProcessDPIAware();

static void Main(string[] args)
{
if (Environment.OSVersion.Version.Major >= 6)
SetProcessDPIAware();

Application.Run(new UIMonitor());
}
}

注意:在 Visual Studio 内部运行时,会自动使用 dpiAware,然后当应用程序在 Visual Studio 外部运行时,它不会自动使用,除非您使用 SetProcessDPIAware() 方法。

关于c# - 具有不同缩放比例的监视器会在屏幕边界之间产生间隙,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34619270/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com