如何在C#中为Windows-7设置主监视器

时间:2013-05-01 21:36:37

标签: c# windows

我相信我需要一个在SetDisplayConfig()中执行此操作的示例。

我的Windows-7系统有两个显示器。当我的程序处于一种模式时,第一台显示器必须打开并且主显示器,第二台显示器必须关闭。在另一种模式中,反之亦然:第一个显示器关闭,第二个显示器开启和初级。

我搜索并搜索了如何使用Windows SDK函数“SetDisplayConfig()”但没有找到任何内容。对SetDisplayConfig()的MSDN引用对我来说太深奥,并且没有示例代码。

我使用ChangeDisplaySettingsEx(),但是这个功能在Windows-7中很不稳定。

谢谢!

1 个答案:

答案 0 :(得分:3)

我目前也同时使用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));
}