处理双监视器配置
双监视器配置生成暂时性多监视器管理器 (TMM) 对话框。 如果两个目标是同一图形适配器的一部分,则 TMM 会将当前映射到其中一个目标的源映射到这两个目标。 TMM 执行映射后,将弹出 TMM 对话框。 如果目标位于不同的图形适配器上,则 TMM 对话框将弹出而不激活第二个监视器。 在这种情况下,TMM 对话框将不能选择克隆或扩展。
以下序列显示了在这种情况下 TMM 调用 IViewHelper 方法和执行其他操作的顺序:
TMM 调用 EnumDisplayDevices 函数来检索当前显示配置,其中包括适配器、显示器和监视器。 有关 EnumDisplayDevices 的详细信息,请参阅Microsoft Windows SDK文档。
TMM 将显示配置与之前记录的显示配置进行比较。
如果显示配置有一个或两个监视器,其中扩展显示信息数据 (EDID) TMM 以前从未遇到过,则 TMM 将继续显示 TMM 对话框。
对于显示配置中的每个适配器,TMM 调用 IViewHelper::GetConnectedIDs 方法,以检索适配器上的所有源,无论源是否映射。
TMM 调用 IViewHelper::GetConnectedIDs 方法以检索适配器上的所有目标,无论目标是否映射。 每个目标都必须连接,但不需要处于活动状态。
对于图形适配器中的每个源,TMM 调用 IViewHelper::GetActiveTopology 方法以检索源的活动目标。
TMM 查找具有映射到目标的源的图形适配器。 此源标识符称为“CloneSource”。如果适配器有两个目标,则 TMM (ULONG targetArray[2]) 创建包含两个条目的数组。 TMM 将现有目标标识符作为第一个元素,将第二个目标标识符作为第二个元素。
TMM 使用指示的参数调用 IViewHelper::SetActiveTopology (adapterName, CloneSource, 2, targetArray) 方法。
TMM 调用 IViewHelper::Commit 方法。
如果从任何 IViewHelper 方法返回错误结果,则计算机不会进入克隆视图,并且会弹出 TMM 对话框,禁用克隆视图和仅外部选项。
如果计算机进入克隆视图,并且用户从 TMM 对话框 (中选择扩展视图,然后单击 “确定 ”或“ 应用) ”,则 TMM 必须关闭克隆视图,如下所示:
TMM 使用指示的参数调用 IViewHelper::SetActiveTopology (adapterName, CloneSource, 1, targetArray) 方法。
TMM 调用 IViewHelper::Commit 方法。
在前面的 SetActiveTopology 调用中,参数 3 设置为 1 而不是 2。 在这种情况下, SetActiveTopology 将 targetArray 解释为包含一个元素的数组。 SetActiveTopology 关闭第二个目标并进入单个视图。 接下来,TMM 使用 ChangeDisplaySettingsEx 函数扩展显示。 有关 ChangeDisplaySettingsEx 的详细信息,请参阅Microsoft Windows SDK文档。
下图显示了当 TMM 处理添加监视器进行双监视器配置的情况时发生的操作流。