如何在 C# 中获得与 windows Display 相同的屏幕排列?

问题描述 投票:0回答:2

我正在尝试以下代码:

foreach (var screen in Screen.AllScreens)
{
    // For each screen, add the screen properties to a list box.
    Console.WriteLine("Device Name: " + screen.DeviceName);
    Console.WriteLine("Bounds: " + screen.Bounds.ToString());
    Console.WriteLine("Working Area: " + screen.WorkingArea.ToString());
    Console.WriteLine("Primary Screen: " + screen.Primary.ToString());
    Console.WriteLine("=====================================================");
}

我明白了:

Device Name: \\.\DISPLAY1
Bounds: {X=3840,Y=0,Width=3840,Height=2160}
Working Area: {X=3840,Y=0,Width=3840,Height=2120}
Primary Screen: False
=====================================================
Device Name: \\.\DISPLAY2
Bounds: {X=-3840,Y=0,Width=3840,Height=2160}
Working Area: {X=-3840,Y=0,Width=3840,Height=2120}
Primary Screen: False
=====================================================
Device Name: \\.\DISPLAY3
Bounds: {X=0,Y=0,Width=3840,Height=2160}
Working Area: {X=0,Y=0,Width=3840,Height=2120}
Primary Screen: True
=====================================================

这很酷,但价值观似乎不匹配。这是我目前的安排。请注意,显示器 2 是主显示器。但是,C# 代码将 Display 3 显示为主,这是错误的。

我认为 Screen 类中一定存在错误(使用 .NET 4.8、Windows 10),那么有什么更好的方法可以像 Display 面板一样获取屏幕位置、边界、排列和主/辅呢?

欢迎任何想法,谢谢!

c# .net winapi screen-resolution multiple-monitors
2个回答
0
投票

WorkingArea X 和 Y 为您提供显示器坐标,然后通过一些二维笛卡尔平面计算,您可以计算出显示器位置。


0
投票

您可以使用屏幕的

WorkingArea
属性。然后按值排序:

   var screens = Screen.AllScreens;
   screens = screens.OrderBy(o => o.WorkingArea.X).ToArray();

然后您将看到屏幕从左到右排序,就像您在窗口显示设置中看到的那样。

这假设您想要水平排序屏幕。请注意,屏幕也可以垂直排序,那么您需要相应地调整逻辑。

© www.soinside.com 2019 - 2024. All rights reserved.