.NET认为屏幕的顺序与Windows控制面板 | 显示 | 屏幕分辨率中的顺序不同。

3
昨晚我在运行Windows 7嵌入式标准版64位操作系统的一台电脑上看到了奇怪的事情,该电脑连接了两个显示器。显示分辨率对话框将这两个显示器从左往右标记为显示器1和显示器2。当我运行自己编写的程序,该程序需要同时使用两个屏幕时,我预期输出应该出现在显示器1上,但实际上出现在了最右侧的显示器上;同样的,我预期输出应该出现在显示器2上,但实际上出现在了最左侧的显示器上。
花了一些时间在此处及Google上搜索,最终我使用了一些代码创建控制台应用程序来显示System.Windows.Forms.Screen.AllScreens的内容:
// For each screen, add the screen properties to a list box.
foreach (var screen in System.Windows.Forms.Screen.AllScreens)
{
    Console.WriteLine("Device Name: " + screen.DeviceName);
    Console.WriteLine("Bounds: " +
        screen.Bounds.ToString());
    Console.WriteLine("Type: " +
        screen.GetType().ToString());
    Console.WriteLine("Working Area: " +
        screen.WorkingArea.ToString());
    Console.WriteLine("Primary Screen: " +
        screen.Primary.ToString());
}

在一个测试机上运行,得到了我期望的结果——AllScreens的顺序与显示分辨率对话框的顺序相匹配。
但是,在有问题的机器上,上面代码的输出却被颠倒了。DISPLAY1处于第二个屏幕(最右侧)的位置,而DISPLAY2则位于最左侧的屏幕上。
这真的很奇怪。由于这不是使用我的程序,所以它应该是.NET内部的问题。同样的代码在其他类似的机器上也能正常工作,因此我认为这不是一个普遍性问题,而是一个仅限于此台机器的问题。我尝试了更多类似问题的搜索,但都没有结果,可能是由于搜索词汇(监视器、屏幕、.NET等)匹配了许多与此问题无关的项目。
有人之前见过这种情况吗?最好有一个解决方法。重新安装.NET 4包没有帮助。在显示分辨率对话框中更改位置,然后再更改回来也没有帮助,即使在两次更改之间重新启动也没有用。
谢谢。

如果您更改控制面板中的屏幕顺序并重新运行程序,是否会在不正常的框和好的框上得到不同的结果? - Sam Axe
交换显示器连接器,选择您的主显示器,然后重试。 - Hans Passant
@Dan-o - 在该站点上还有3个以同样方式完成且正常工作的盒子。通过控制面板更改屏幕顺序不会改变其行为。 - GuyWithDogs
@HansPassant -- 无法交换显示器连接器 - 其中一个是DVI,另一个是VGA。屏幕已经连接在屏幕侧的这些连接器上,连接到运行相同WES7映像和相同软件的其他机器上,并且正常工作。 - GuyWithDogs
1个回答

1

AllScreens属性是通过EnumDisplayMonitors函数填充的。

EnumDisplayMonitors的文档没有指示它返回显示器的顺序,因此可以推断这是一个实现细节,可能会随着操作系统版本的变化而改变。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接