5

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

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

我已经搜索并搜索了如何使用 Windows SDK 函数“SetDisplayConfig()”来执行此操作,但一无所获。MSDN 对 SetDisplayConfig() 的引用对我来说太深奥了,并且没有示例代码。

我使用 ChangeDisplaySettingsEx() 来实现它,但这个函数在 Windows-7 中是不稳定的。

谢谢!

4

2 回答 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));
}
于 2014-01-04T16:16:04.040 回答
0

函数 SetDisplayConfig 将左上角位于 (0, 0) 的监视器视为主监视器(所有其他监视器应相对于它定位)。应使用modeInfoArray参数向 SetDisplayConfig 提供有关监视器协调的此类信息。

于 2021-10-18T11:21:50.473 回答