Обработка конфигураций двух мониторов
Конфигурация с двумя мониторами создает диалоговое окно Диспетчер временных нескольких мониторов (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 обрабатывает ситуацию, когда монитор добавляется для создания конфигурации с двумя мониторами.