如何在Windows 7中设置主显示器,使用C#

5
我相信我需要一个SetDisplayConfig()的示例。
我的Windows-7系统有两个监视器。当我的程序处于一种模式时,第一个监视器必须处于打开且为主显示器状态,第二个监视器必须关闭。在另一种模式下,情况刚好相反:第一个监视器关闭,第二个监视器打开并成为主显示器。
尝试使用Windows SDK函数"SetDisplayConfig()"来实现这个功能,但是查找了很多资料都没有相关信息。MSDN对SetDisplayConfig()的说明对我来说太过深奥,并没有示例代码。
我已经成功地使用ChangeDisplaySettingsEx()实现了该功能,但是在Windows-7上,这个函数不太稳定。
谢谢!

请查看我在重复问题中的答案:https://dev59.com/RXHYa4cB1Zd3GeqPOKph - Xaruth
2个回答

7

我目前在操作 SetDisplayConfig()ChangeDisplaySettingsEx(),并发现这对我的设置有效。 SDC_TOPOLOGY_INTERNALSDC_TOPOLOGY_EXTERNAL 是指Windows决定的主(屏幕)和次(投影仪)监视器,类似于按下 Win+P 时选择监视器。但是对于我来说,情况正好相反,所以您需要检查您的配置中哪一个是正确的。然后,您只需调用 InternalDisplay()ExternalDisplay() 来激活其中一个,并自动停用另一个。我添加了克隆和扩展设置以保持完整性。

[DllImport("user32.dll", CharSet = CharSet.Unicode)]
private static extern long SetDisplayConfig(uint numPathArrayElements,
IntPtr pathArray, uint numModeArrayElements, IntPtr modeArray, uint flags);

UInt32 SDC_TOPOLOGY_INTERNAL = 0x00000001;
UInt32 SDC_TOPOLOGY_CLONE = 0x00000002;
UInt32 SDC_TOPOLOGY_EXTEND = 0x00000004;
UInt32 SDC_TOPOLOGY_EXTERNAL = 0x00000008;
UInt32 SDC_APPLY = 0x00000080;

public void CloneDisplays() {
  SetDisplayConfig(0, IntPtr.Zero, 0, IntPtr.Zero, (SDC_APPLY | SDC_TOPOLOGY_CLONE));
}

public void ExtendDisplays() {
  SetDisplayConfig(0, IntPtr.Zero, 0, IntPtr.Zero, (SDC_APPLY | SDC_TOPOLOGY_EXTEND));
 }

public void ExternalDisplay() {
  SetDisplayConfig(0, IntPtr.Zero, 0, IntPtr.Zero, (SDC_APPLY | SDC_TOPOLOGY_EXTERNAL));
}

public void InternalDisplay() {
  SetDisplayConfig(0, IntPtr.Zero, 0, IntPtr.Zero, (SDC_APPLY | SDC_TOPOLOGY_INTERNAL));
}

0

函数SetDisplayConfig将左上角坐标为(0, 0)的显示器视为主显示器(其他所有显示器应相对于它进行定位)。关于显示器坐标的这种信息应通过modeInfoArray参数提供给SetDisplayConfig。


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