【问题标题】:MultiMonitorSetup: Duplicate Desktop between secondary monitors programmaticallyMultiMonitorSetup:以编程方式在辅助监视器之间复制桌面
【发布时间】:2017-08-21 09:02:30
【问题描述】:

我想以编程方式在以下两种模式之间切换:

我已经尝试使用SetDisplayConfig 函数,但失败了。使用以下命令可以将 主监视器 克隆到所有连接的显示器:

SetDisplayConfig(0, null, 0, null, 
    SetDisplayConfigFlags.SDC_TOPOLOGY_CLONE | SetDisplayConfigFlags.SDC_APPLY);

很遗憾,我需要复制 secondary 显示器!

我发现了另一种有问题的方法How to make clone or extended mode。但我无法将不同显示的源设置为相同的参考。

【问题讨论】:

    标签: c# .net winapi multiple-monitors mirror


    【解决方案1】:

    适用于 Windows 7 的工作解决方案:

    要在两个(或更多)连接的设备之间克隆/复制桌面,您所要做的就是:

    1. 查询显示配置()
    2. 为要复制桌面的所有“PathInfoArray”项目共享“sourceInfo.id”和“sourceInfo.modeInfoIdx”。例如将显示“索引 1”复制到显示索引“2 和 3”:

      • PathInfoArray[2].sourceInfo.id = PathInfoArray[1].sourceInfo.id
      • PathInfoArray[2].sourceInfo.modeInfoIdx = PathInfoArray[1].sourceInfo.modeInfoIdx
      • PathInfoArray[3].sourceInfo.id = PathInfoArray[1].sourceInfo.id
      • PathInfoArray[3].sourceInfo.modeInfoIdx = PathInfoArray[1].sourceInfo.modeInfoIdx
    3. SetDisplayConfig()


    要在两个或多个显示器之间扩展显示器(如果显示器是克隆的),这有点棘手:

    1. 查询显示配置()
    2. 为“SourceModeInfoArray”中的每个附加克隆显示添加一个 infoType 为“Source”的“SourceModeInfo”项目:如果配置了两个显示,则需要一个额外的“SourceModeInfo”项目(如果克隆了三个 => 2 个项目,依此类推)
    3. 为克隆的显示器之一扩展 PathInfoArray 以指向附加的“SourceModeInfo” - 项目:

      • PathInfoArray[2].sourceInfo.id = AddItem.sourceInfo.id;
      • PathInfoArray[2].sourceInfo.modeInfoIdx = AddItem.sourceInfo.modeInfoIdx;
    4. SetDisplayConfig()

    这仅适用于 Win7。


    在 Windows 10 RS1 及更高版本上,SetDisplayConfig() 将因 invalid parameter 而失败。我不太清楚为什么,但我认识到在 Windows 10 下,“ModeInfo.adapterId”(低和高部分)在每次重新启动时都会发生变化。此外,当您通过“Windows-Settings -> Display”复制/扩展时,适配器会发生变化。 这就是为什么我相信在 Windows 10 下你也必须调整 PathModeInfoArray 和 SourceModeInfoArray 的 adapterid。

    现在的问题:我不知道如何为此目的获取正确的适配器 ID。如果有人有在 Windows 10 下解决此问题的答案/提示,我将不胜感激。(我需要一个适用于 Windows 10 的工作解决方案:-()

    【讨论】:

    • 嗨。您是否有可用于 Windows 10 的工作代码?我一直在寻找可以镜像或断开 AVR 的类似解决方案。
    • @Trm 抱歉,恐怕到目前为止我还没有找到适用于 W10 的有效解决方案。如果你能找到办法,请。让我知道:-)
    【解决方案2】:

    先改变主显示器然后SetDisplayConfig()怎么样?

    使用 CDS_SET_PRIMARY 更改显示设置 https://msdn.microsoft.com/en-us/library/windows/desktop/dd183413(v=vs.85).aspx

    然后调用 SetDisplayConfig 进行克隆。

    【讨论】:

    • 我想在两个辅助显示器之间克隆桌面。主桌面不应受到影响并显示其自己的内容。 --> 两个独立区域(主监视器和克隆区域[显示 2 和 3])
    • 好的,我明白了,如果没有额外的软件,这可能是不可能的。
    • 没有API可以像用户通过控制面板做的一样吗? (选择两个Display并在它们之间复制)
    【解决方案3】:

    关于在 win 10 上复制多个监视器的整个故事与将目标监视器的 x 和 y 位置设置为在源监视器中找到的位置有关。 所以,首先:

    • 浏览所有路径的列表,找到源监视器和目标监视器的索引(最好只使用那些处于活动状态的监视器)
    • 从源监视器获取 x 和 y 位置(来自模式数组 - 即 DISPLAYCONFIG_MODE_INFO)
    • 设置从源获取的目标监视器 x 和 y 位置
    • 创建仅包含活动路径的新显示路径阵列(很容易将上部活动阵列放入新的阵列中。
    • 使用新路径数组和现有模式调用 SetDisplayConfig(考虑模式和路径数组的大小

    【讨论】:

      猜你喜欢
      • 2018-06-08
      • 2014-07-09
      • 2017-11-30
      • 1970-01-01
      • 2010-10-29
      • 1970-01-01
      • 2014-09-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多