перечисление PROCESS_DPI_AWARENESS (shellscalingapi.h)

Определяет значения осведомленности точек на дюйм (dpi). Осведомленность о DPI указывает, сколько работы по масштабированию приложение выполняет для DPI и сколько выполнено системой.

Пользователи могут устанавливать коэффициент масштабирования DPI на своих дисплеях независимо друг от друга. Некоторые устаревшие приложения не могут настроить масштабирование для нескольких параметров DPI. Чтобы пользователи могли использовать эти приложения без слишком большого или маленького содержимого на дисплеях, Windows может применить виртуализацию DPI к приложению, в результате чего система автоматически масштабирует его в соответствии с DPI текущего дисплея. Значение PROCESS_DPI_AWARENESS указывает, какой уровень масштабирования выполняет приложение самостоятельно и какой объем предоставляет Windows. Имейте в виду, что приложения, масштабируемые системой, могут выглядеть размытыми и считывать виртуализированные данные о мониторе для обеспечения совместимости.

Синтаксис

typedef enum PROCESS_DPI_AWARENESS {
  PROCESS_DPI_UNAWARE = 0,
  PROCESS_SYSTEM_DPI_AWARE = 1,
  PROCESS_PER_MONITOR_DPI_AWARE = 2
} ;

Константы

 
PROCESS_DPI_UNAWARE
Значение: 0
DPI не подозревает. Это приложение не масштабируется при изменении DPI и всегда предполагается, что коэффициент масштабирования составляет 100 % (96 точек на дюйм). Он будет автоматически масштабироваться системой при любом другом параметре DPI.
PROCESS_SYSTEM_DPI_AWARE
Значение: 1
С учетом системного DPI. Это приложение не масштабируется для изменения DPI. Он будет запрашивать DPI один раз и использовать это значение в течение времени существования приложения. При изменении DPI приложение не будет настраиваться на новое значение DPI. Он будет автоматически масштабироваться системой при изменении DPI от системного значения.
PROCESS_PER_MONITOR_DPI_AWARE
Значение: 2
Для каждого монитора учитывается DPI. Это приложение проверяет наличие DPI при его создании и корректирует коэффициент масштабирования при каждом изменении DPI. Эти приложения не масштабируются системой автоматически.

Комментарии

Важно  

В предыдущих версиях Windows требовалось настроить сведения о DPI для всего приложения. Теперь осведомленность о DPI привязана к отдельным потокам, процессам или окнам. Это означает, что осведомленность о DPI может измениться во время работы приложения и что несколько окон могут иметь собственные независимые значения осведомленности о DPI. Дополнительные сведения о том, как в настоящее время работает осведомленность о DPI, см. в DPI_AWARENESS . Приведенные ниже рекомендации по настройке осведомленности о DPI в манифесте приложения по-прежнему поддерживаются, но в настоящее время рекомендуется использовать DPI_AWARENESS_CONTEXT.

 
Сведения о DPI для приложения должны быть заданы с помощью манифеста приложения, чтобы он был определен перед выполнением любых действий, которые зависят от DPI системы. Кроме того, вы можете задать сведения о DPI с помощью SetProcessDpiAwareness, но в этом случае необходимо установить его перед выполнением каких-либо действий, зависящих от системного DPI. После настройки осведомленности о DPI для процесса его нельзя будет изменить.
Совет  

Если приложение PROCESS_DPI_UNAWARE, нет необходимости задавать значение в манифесте приложения. PROCESS_DPI_UNAWARE является значением по умолчанию для приложений, если не указано другое значение.

 
PROCESS_DPI_UNAWARE и PROCESS_SYSTEM_DPI_AWARE приложения не должны реагировать на WM_DPICHANGED и не должны обрабатывать изменения в DPI. Система будет автоматически масштабировать эти типы приложений по мере необходимости при изменении DPI. PROCESS_PER_MONITOR_DPI_AWARE приложения отвечают за распознавание и реагирование на изменения в DPI, о которых свидетельствует WM_DPICHANGED. Они не будут масштабироваться системой. Если приложение этого типа не изменяет размер окна и его содержимого, оно будет увеличиваться или уменьшаться на относительные изменения DPI при перемещении окна с одного дисплея на другой с другим параметром DPI.
Совет  

В предыдущих версиях Windows не было параметра для PROCESS_PER_MONITOR_DPI_AWARE. Приложения либо не знали DPI, либо учитывали DPI. Устаревшие приложения, которые были классифицированы как DPI до Windows 8.1, считаются PROCESS_DPI_AWARENESSпараметром PROCESS_SYSTEM_DPI_AWARE в текущих версиях Windows.

 
Чтобы понять важность и влияние различных значений осведомленности о DPI, рассмотрим пользователя с тремя дисплеями: A, B и C. Для дисплея A задан коэффициент масштабирования 100 % (96 точек на дюйм), для дисплея B — 200 % коэффициент масштабирования (192 точек на дюйм), а для дисплея C — значение 300 % коэффициента масштабирования (288 точек на дюйм). Для системного DPI задано значение 200 %.

Приложение, которое PROCESS_DPI_UNAWARE , всегда будет использовать коэффициент масштабирования 100 % (96 точек на дюйм). В этом сценарии создается окно PROCESS_DPI_UNAWARE размером 500 на 500. При отображении A он будет отображаться в собственном коде без масштабирования. На дисплеях B и C система автоматически масштабируется в 2 и 3 раз. Это связано с тем, что PROCESS_DPI_UNAWARE всегда предполагает, что DPI равен 96, и система учитывает это. Если приложение запрашивает размер окна, оно всегда получает значение 500 на 500 независимо от того, на каком экране оно отображается. Если приложение запросит разрешение любого из трех мониторов, оно получит значение 96.

Теперь рассмотрим приложение, которое PROCESS_SYSTEM_DPI_AWARE. Помните, что в примере значение DPI системы равно 200 % или 192 DPI. Это означает, что все окна, созданные этим приложением, будут отображаться изначально на дисплее B. Это окно перемещается на экран A, оно будет автоматически уменьшено в 2 раз. Это связано с тем, что приложение PROCESS_SYSTEM_DPI_AWARE в этом сценарии предполагает, что DPI всегда будет иметь значение 192. Он запрашивает DPI при запуске, а затем никогда не изменяет его. Система поддерживает это путем автоматического уменьшения масштаба при перемещении к экрану A. Аналогичным образом, если окно перемещается на экран C, система автоматически масштабируется в 1,5 раз. Если приложение запрашивает размер окна, оно всегда будет получать одно и то же значение, аналогичное PROCESS_DPI_UNAWARE. Если он запросит DPI любого из трех мониторов, он получит 192.

В отличие от других значений осведомленности, PROCESS_PER_MONITOR_DPI_AWARE должны адаптироваться к отображению, на котором он находится. Это означает, что он всегда отображается в собственном коде и никогда не масштабируется системой. Приложение отвечает за настройку коэффициента масштабирования при получении сообщения WM_DPICHANGED . Часть этого сообщения содержит рекомендуемый прямоугольник для окна. Это предложение является текущим окном, масштабируемым со старого значения DPI на новое значение DPI. Например, окно, которое имеет размер 500 на 500 на дисплее A и перемещено на экран B, получит рекомендуемый прямоугольник окна, который равен 1000 на 1000. Если это же окно переместится на экран C, рекомендуемый прямоугольник окна, прикрепленный к WM_DPICHANGED , будет иметь размер 1500 на 1500. Кроме того, когда это приложение запрашивает размер окна, оно всегда получает фактическое собственное значение. Аналогичным образом, если он запросит DPI любого из трех мониторов, он получит 96, 192 и 288 соответственно.

Из-за виртуализации DPI, если одно приложение запрашивает другое с другим уровнем осведомленности для информации, зависящей от DPI, система автоматически масштабирует значения в соответствии с уровнем осведомленности вызывающего объекта. Одним из примеров этого является вызов Метода GetWindowRect и передача окна, созданного другим приложением. Используя описанную выше ситуацию, предположим, что приложение PROCESS_DPI_UNAWARE создало окно 500 на 500 на дисплее C. Если вы запрашиваете прямоугольник окна из другого приложения, размер прямоугольника будет зависеть от уровня DPI вашего приложения.

PROCESS_DPI_UNAWARE Вы получите прямоугольник 500 на 500, так как система будет принимать DPI 96 и автоматически масштабировать фактический прямоугольник в 3 раз.
PROCESS_SYSTEM_DPI_AWARE Вы получите прямоугольник 1000 на 1000, так как система будет принимать DPI 192 и автоматически масштабировать фактический прямоугольник в 3/2.
PROCESS_PER_MONITOR_DPI_AWARE Вы получите прямоугольник 1500 на 1500, так как система будет использовать фактическое разрешение дисплея и не выполнять масштабирование в фоновом режиме.
 

Примеры

В этом фрагменте кода показано, как задать значение PROCESS_SYSTEM_DPI_AWARE в манифесте приложения.

<dpiAware>true</dpiAware>

В этом фрагменте кода показано, как задать значение PROCESS_PER_MONITOR_DPI_AWARE в манифесте приложения.

<dpiAware>true/PM</dpiAware>

Требования

Требование Значение
Минимальная версия клиента Windows 8.1 [только классические приложения]
Минимальная версия сервера Windows Server 2012 R2 [только классические приложения]
Верхняя часть shellscalingapi.h

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

DPI_AWARENESS