Поделиться через


Функция SetDisplayConfig (winuser.h)

Функция SetDisplayConfig изменяет топологию отображения, исходный и целевой режимы, включив исключительно указанные пути в текущем сеансе.

Синтаксис

LONG SetDisplayConfig(
  [in]           UINT32                  numPathArrayElements,
  [in, optional] DISPLAYCONFIG_PATH_INFO *pathArray,
  [in]           UINT32                  numModeInfoArrayElements,
  [in, optional] DISPLAYCONFIG_MODE_INFO *modeInfoArray,
  [in]           UINT32                  flags
);

Параметры

[in] numPathArrayElements

Количество элементов в pathArray.

[in, optional] pathArray

Массив всех путей отображения, которые необходимо задать. Задаются только пути в этом массиве, для которых в элементе флаговDISPLAYCONFIG_PATH_INFO задан флаг DISPLAYCONFIG_PATH_ACTIVE. Этот параметр может принимать значение NULL. Порядок, в котором активные пути отображаются в этом массиве, определяет приоритет пути. Дополнительные сведения о порядке приоритета пути см. в разделе Порядок приоритета пути.

[in] numModeInfoArrayElements

Количество элементов в modeInfoArray.

[in, optional] modeInfoArray

Массив сведений об источнике отображения и режиме назначения (DISPLAYCONFIG_MODE_INFO), на который ссылается элемент modeInfoIdx DISPLAYCONFIG_PATH_SOURCE_INFO и DISPLAYCONFIG_PATH_TARGET_INFO элемент сведений о пути из pathArray. Этот параметр может принимать значение NULL.

[in] flags

Побитовое ИЛИ значений флага, указывающее поведение этой функции. Этот параметр может быть одним из следующих значений или сочетанием следующих значений: Недопустимо значение 0. Описание допустимых сочетаний флагов см. ниже.

Значение Значение
SDC_APPLY
0x00000080
Задана итоговая топология, исходный и целевой режимы.
SDC_NO_OPTIMIZATION
0x00000100
Модификатор флага SDC_APPLY. Это приводит к принудительному изменению режима вплоть до драйвера для каждого активного дисплея.
SDC_USE_SUPPLIED_DISPLAY_CONFIG
0x00000020
Используются сведения о топологии, источнике и целевом режиме, которые предоставляются в параметрах pathArray и modeInfoArray , а не для поиска конфигурации в базе данных.
SDC_SAVE_TO_DATABASE
0x00000200
Итоговая топология, исходный и целевой режим сохраняются в базе данных.
SDC_VALIDATE
0x00000040
Система проверяет запрошенную информацию о топологии, источнике и целевом режиме, чтобы определить, можно ли их задать.
SDC_ALLOW_CHANGES
0x00000400
При необходимости функция может изменить указанные сведения об исходном и целевом режиме, чтобы создать функциональный набор путей отображения.
SDC_TOPOLOGY_CLONE
0x00000002
Вызывающий объект запрашивает последнюю конфигурацию клонирования из базы данных сохраняемости.
SDC_TOPOLOGY_EXTEND
0x00000004
Вызывающий объект запрашивает последнюю расширенную конфигурацию из базы данных сохраняемости.
SDC_TOPOLOGY_INTERNAL
0x00000001
Вызывающий объект запрашивает последнюю внутреннюю конфигурацию из базы данных сохраняемости.
SDC_TOPOLOGY_EXTERNAL
0x00000008
Вызывающий объект запрашивает последнюю внешнюю конфигурацию из базы данных сохраняемости.
SDC_TOPOLOGY_SUPPLIED
0x00000010
Вызывающий объект предоставляет данные пути, поэтому функция запрашивает только базу данных сохраняемости для поиска и использования исходного и целевого режимов.
SDC_USE_DATABASE_CURRENT
(SDC_TOPOLOGY_INTERNAL | SDC_TOPOLOGY_CLONE | SDC_TOPOLOGY_EXTEND | SDC_TOPOLOGY_EXTERNAL)
Вызывающий объект запрашивает сочетание всех четырех конфигураций SDC_TOPOLOGY_XXX. Это значение информирует API о необходимости задать последнюю известную конфигурацию отображения для текущих подключенных мониторов.
SDC_PATH_PERSIST_IF_REQUIRED
0x00000800
Когда функция обрабатывает запрос SDC_TOPOLOGY_XXX, она может принудительно принудить сохраняемость пути к целевому объекту, чтобы при необходимости выполнить запрос. Сведения о других флагах, с которыми можно объединить этот флаг, см. в следующем списке.
SDC_FORCE_MODE_ENUMERATION
0x00001000
Вызывающий объект запрашивает, чтобы драйверу была предоставлена возможность обновить список режимов GDI, а SetDisplayConfig задает новую конфигурацию отображения. Это значение флага допустимо только в том случае, если также указаны значения флагов SDC_USE_SUPPLIED_DISPLAY_CONFIG и SDC_APPLY.
SDC_ALLOW_PATH_ORDER_CHANGES
0x00002000
Модификатор флага SDC_TOPOLOGY_SUPPLIED, который указывает, что SetDisplayConfig должен игнорировать порядок пути указанной топологии при поиске в базе данных. Если этот флаг установлен, набор топологий является последней топологией, которая содержит все пути независимо от порядка пути.
SDC_VIRTUAL_MODE_AWARE
0x00008000
Модификатор для SDC_USE_SUPPLIED_DISPLAY_CONFIG и SDC_TOPOLOGY_SUPPLIED флаги, которые вызывающий объект знает о виртуальных режимах. Поддерживается начиная с Windows 10.
SDC_VIRTUAL_REFRESH_RATE_AWARE
0x00020000
Модификатор для SDC_USE_SUPPLIED_DISPLAY_CONFIG и SDC_TOPOLOGY_SUPPLIED флагов, о которых вызывающему абоненту известно частота виртуальных обновлений. Поддерживается начиная с Windows 11.

Следующий список содержит допустимые сочетания значений для параметра Flags :

  • Необходимо задать SDC_APPLY или SDC_VALIDATE, но не оба.
  • Необходимо задать SDC_USE_SUPPLIED_DISPLAY_CONFIG или любые сочетания SDC_TOPOLOGY_XXX. SDC_USE_SUPPLIED_DISPLAY_CONFIG нельзя задать с флагом SDC_TOPOLOGY_XXX.
  • SDC_NO_OPTIMIZATION можно задать только с помощью SDC_APPLY.
  • SDC_ALLOW_CHANGES допускается с любым другим допустимым сочетанием.
  • SDC_SAVE_TO_DATABASE можно задать только с помощью SDC_USE_SUPPLIED_DISPLAY_CONFIG.
  • SDC_PATH_PERSIST_IF_REQUIRED нельзя использовать с SDC_USE_SUPPLIED_DISPLAY_CONFIG или SDC_TOPOLOGY_SUPPLIED.
  • SDC_FORCE_MODE_ENUMERATION действителен, только если указаны SDC_APPLY и SDC_USE_SUPPLIED_DISPLAY_CONFIG.
  • SDC_ALLOW_PATH_ORDER_CHANGES допускается только при указании SDC_TOPOLOGY_SUPPLIED.
  • SDC_TOPOLOGY_SUPPLIED нельзя использовать с другими флагами SDC_TOPOLOGY_XXX. Из-за проблемы с проверкой, если вызывающий объект нарушает это правило, SetDisplayConfig не завершается ошибкой. Однако SetDisplayConfig игнорирует флаг SDC_TOPOLOGY_SUPPLIED.
SDC_TOPOLOGY_XXX флаги можно использовать в сочетаниях. Например, если заданы SDC_TOPOLOGY_CLONE и SDC_TOPOLOGY_EXTEND, API использует последнюю топологию клонирования или расширения, которая была задана для последней топологии для текущих подключенных мониторов.

Возвращаемое значение

Функция возвращает один из следующих кодов возврата.

Код возврата Описание
ERROR_SUCCESS
Функция выполнена успешно.
ERROR_INVALID_PARAMETER
Указанное сочетание параметров и флагов недопустимо.
ERROR_NOT_SUPPORTED
В системе не запущен графический драйвер, написанный в соответствии с моделью драйвера дисплея Windows (WDDM). Функция поддерживается только в системе с работающим драйвером WDDM.
ERROR_ACCESS_DENIED
Вызывающий объект не имеет доступа к сеансу консоли. Эта ошибка возникает, если вызывающий процесс не имеет доступа к текущему рабочему столу или выполняется в удаленном сеансе.
ERROR_GEN_FAILURE
Произошла неизвестная ошибка.
ERROR_BAD_CONFIGURATION
Функции не удалось найти работоспособное решение для исходного и целевого режимов, которые не указал вызывающий объект.

Комментарии

Функция SetDisplayConfig принимает активные пути отображения с указанием всех указанных исходных и целевых режимов и использует логику наилучшего режима для создания отсутствующих сведений об исходном и целевом режимах. Затем эта функция задает полный путь отображения.

Элементы ModeInfoIdx в структурах DISPLAYCONFIG_PATH_SOURCE_INFO и DISPLAYCONFIG_PATH_TARGET_INFO используются для указания того, предоставляются ли исходный и целевой режимы для заданного активного пути. Если значение индекса DISPLAYCONFIG_PATH_MODE_IDX_INVALID для, это означает, что сведения о режиме не указаны. Оно допустимо для указания пути и режима источника или сведений о пути и целевом режиме для заданного пути. Однако недопустимо указывать путь и целевой режим без исходного режима.

Исходный и целевой режимы для каждого исходного и целевого идентификаторов могут отображаться в массиве modeInfoArray только один раз. Например, режим источника для идентификатора источника S1 может отображаться в таблице только один раз; Если несколько путей ссылаются на один источник, они должны использовать один и тот же ModeInfoIdx.

Ожидается, что большинство вызывающих абонентов используют QueryDisplayConfig для получения текущей конфигурации вместе с другими допустимыми возможностями, а затем используют SetDisplayConfig для тестирования и настройки конфигурации.

Порядок, в котором активные пути отображаются в массиве PathArray , определяет приоритет пути.

По умолчанию SetDisplayConfig никогда не изменяет предоставленные путь, исходный режим или сведения о целевом режиме. Если логике наилучшего режима не удается найти решение без изменения указанной информации о пути отображения, setDisplayConfig завершается сбоем с ERROR_BAD_CONFIGURATION. В этом случае вызывающий объект должен указать флаг SDC_ALLOW_CHANGES, чтобы позволить функции изменить некоторые из указанных сведений об источнике и режиме, чтобы путь отображения был успешно изменен.

Если указанный или вычисляемый режимы источника и целевого объекта имеют одинаковые измерения, SetDisplayConfig автоматически устанавливает для масштабирования пути DISPLAYCONFIG_PPR_IDENTITY, прежде чем задавать путь отображения и сохранять его в базе данных. Сведения о том, как SetDisplayConfig обрабатывает масштабирование, см. в разделе Масштабирование образа рабочего стола.

Если вызывающий объект задает флаг SDC_USE_SUPPLIED_DISPLAY_CONFIG для задания пути клонирования и если какие-либо индексы исходного режима недопустимы в массиве путей, SetDisplayConfig определяет, что все индексы исходного режима из этого источника являются недопустимыми. SetDisplayConfig использует логику наилучшего режима для определения сведений о исходном режиме.

За исключением флага SDC_TOPOLOGY_SUPPLIED (дополнительные сведения о SDC_TOPOLOGY_SUPPLIED см. в следующем абзаце), флаги SDC_TOPOLOGY_XXX задают последние параметры пути отображения, включая сведения об исходном и целевом режимах для этого типа топологии. Сведения о допустимых сочетаниях флагов SDC_TOPOLOGY_XXX см. в описании параметра Flags . Параметры pathArray и modeInfoArray должны иметь значение NULL, а связанные с ними размеры должны быть равны нулю. Например, если заданы SDC_TOPOLOGY_CLONE и SDC_TOPOLOGY_EXTEND, эта функция использует последнюю конфигурацию клонирования или расширения пути отображения. Если запрашивается один тип топологии, используется последняя конфигурация этого типа. Если эта топология никогда не была задана ранее, SetDisplayConfig использует лучшая логика топологии для поиска наилучшей топологии, а затем логику наилучшего режима для поиска оптимального исходного и целевого режимов. Если задано сочетание флагов топологии и ни одна из них не содержит записей базы данных, используется следующий приоритет. Для ноутбуков: клонирование, расширение, внутреннее, а затем внешнее; Для рабочих столов приоритетом является расширение, а затем клонирование.

Вызывающий объект может указать флаг SDC_TOPOLOGY_SUPPLIED, чтобы указать, что он задает только сведения о пути (топологию) и запрашивает, которые SetDisplayConfig получает, а затем использует сведения об исходном и целевом режимах из базы данных сохраняемости. Если активные пути, которые предоставляет вызывающий объект, не имеют записи в базе данных сохраняемости, SetDisplayConfig завершается сбоем. В этом случае, если вызывающий объект снова вызывает SetDisplayConfig с теми же данными пути, но с установленным флагом SDC_USE_SUPPLIED_DISPLAY_CONFIG, SetDisplayConfig использует логику наилучшего режима для создания сведений об исходном и целевом режимах. Если вызывающий объект указывает SDC_TOPOLOGY_SUPPLIED, вызывающий объект должен задать для параметра numModeInfoArrayElements значение 0, а для параметра modeInfoArrayзначение NULL; однако вызывающий объект должен задать параметры pathArray и numPathArrayElements для сведений о пути, необходимых вызывающей объекту. Вызывающий объект должен пометить все индексы исходного и целевого режимов как недопустимые (DISPLAYCONFIG_PATH_MODE_IDX_INVALID) в данных пути.

В следующей таблице приведены некоторые распространенные сценарии, в которых метод SetDisplayConfig вызывается вместе с сочетаниями флагов, которые вызывающий объект передает в параметр Flags для реализации этих сценариев.

Сценарий Сочетание флагов
Проверка поддержки указанной конфигурации дисплея на компьютере SDC_VALIDATE | SDC_USE_SUPPLIED_DISPLAY_CONFIG
Настройка указанной конфигурации отображения и сохранение в базе данных SDC_APPLY | SDC_USE_SUPPLIED_DISPLAY_CONFIG | SDC_SAVE_TO_DATABASE
Настройка временной конфигурации дисплея (то есть конфигурация отображения не будет сохранена) SDC_APPLY | SDC_USE_SUPPLIED_DISPLAY_CONFIG
Проверка поддержки клонирования на компьютере SDC_VALIDATE | SDC_TOPOLOGY_CLONE
Настройка топологии клонирования SDC_APPLY | SDC_TOPOLOGY_CLONE
Настройка клонирования топологии и включение сохраняемости пути, если это необходимо для удовлетворения запроса SDC_APPLY | SDC_TOPOLOGY_CLONE | SDC_PATH_PERSIST_IF_REQUIRED
Возврат из временного режима в последнюю сохраненную конфигурацию дисплея SDC_APPLY| SDC_USE_DATABASE_CURRENT
Учитывая только сведения о пути, задайте конфигурацию отображения с исходными и целевыми сведениями из базы данных для путей и игнорируйте порядок пути. SDC_APPLY | SDC_TOPOLOGY_SUPPLIED | SDC_ALLOW_PATH_ORDER_CHANGES
 

Виртуализация DPI

Этот API не участвует в виртуализации DPI. Все размеры в структуре DEVMODE имеют физические пиксели и не связаны с контекстом вызова.

Требования

   
Минимальная версия клиента Доступно в Windows 7 и более поздних версиях операционных систем Windows.
Целевая платформа Универсальное
Верхняя часть winuser.h (включая Windows.h)
Библиотека User32.lib
DLL User32.dll
Набор API ext-ms-win-ntuser-sysparams-ext-l1-1-1 (представлено в Windows 10 версии 10.0.14393)

См. также раздел

DISPLAYCONFIG_MODE_INFO

DISPLAYCONFIG_PATH_INFO

DISPLAYCONFIG_PATH_SOURCE_INFO

DISPLAYCONFIG_PATH_TARGET_INFO

QueryDisplayConfig