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


Настройка осведомленности по умолчанию о DPI для процесса

Классические приложения в Windows могут работать в разных режимах осведомленности о DPI. Эти режимы позволяют использовать различные режимы масштабирования DPI и могут использовать разные пространства координат. Дополнительные сведения о осведомленности о DPI см. в статье "Разработка классических приложений с высоким уровнем DPI" в Windows. Важно явно задать режим осведомленности о DPI по умолчанию для процесса, чтобы избежать непредвиденного поведения.

Существует два основных метода для указания осведомленности о DPI по умолчанию для процесса:

1) с помощью параметра манифеста приложения

2) программным путем через вызов API

Мы рекомендуем указать уровень осведомленности по умолчанию о DPI процесса с помощью параметра манифеста. При указании значения по умолчанию через API поддерживается, не рекомендуется.

Настройка осведомленности по умолчанию с помощью манифеста приложения

Существует два параметра манифеста, которые позволяют указать режим осведомленности о DPI по умолчанию процесса: <dpiAwareness> и <dpiAware>. <DpiAware> была представлена в Windows Vista и позволяет задать уровень осведомленности о системе только по умолчанию. <DpiAwareness> появился в Windows 10 версии 1607 и позволяет указать упорядоченный список режимов осведомленности DPI по умолчанию по умолчанию. Это позволяет задать режимы осведомленности о DPI резервного копирования, которые будут использоваться, если приложение запущено в версии Windows, не в состоянии поддерживать первый режим осведомленности, указанный. В более старых версиях Windows более новый <тег dpiAwareness> будет игнорироваться. Это означает, что вы можете использовать оба этих параметра манифеста, чтобы включить сценарий, в котором ваш процесс по умолчанию может быть системной осведомленностью о более старой версии Windows при использовании per-Monitor в версиях больше Windows 10 версии 1607. В Windows 10 версии 1607 и включено параметр dpiAware> игнорируется, <если <элемент dpiAwareness> присутствует.

В таблице ниже показано, как указать различные режимы осведомленности по умолчанию по умолчанию, используя два параметра манифеста:

Режим осведомленности о DPI по умолчанию <Параметр dpiAware> <Параметр dpiAwareness>
(Windows 10, версия 1607 и более поздние версии)
не подозревающий N/A (без параметра dpiAware в манифесте)
or
<dpiAware>false</dpiAware>
<dpiAwareness не знает</dpiAwareness>>
Системное представление <dpiAware>true</dpiAware> <dpiAwareness system</dpiAwareness>>
На монитор <dpiAware>true/pm<dpiAware> <dpiAwareness PerMonitor</dpiAwareness>>
На монитор версии 2 Не поддерживается <dpiAwareness PerMonitorV2</dpiAwareness>>

 

В приведенном ниже примере показано, <как dpiAwareness> , так и <параметры dpiAware> , используемые в одном файле манифеста для настройки поведения осведомленности О DPI по умолчанию процесса для различных версий Windows.

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0" xmlns:asmv3="urn:schemas-microsoft-com:asm.v3">
  <asmv3:application>
    <asmv3:windowsSettings>
      <dpiAware xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">true</dpiAware>
      <dpiAwareness xmlns="http://schemas.microsoft.com/SMI/2016/WindowsSettings">PerMonitorV2</dpiAwareness>
    </asmv3:windowsSettings>
  </asmv3:application>
</assembly>

Настройка осведомленности по умолчанию программным способом

Хотя это не рекомендуется, можно программно задать уровень осведомленности о DPI по умолчанию. После создания окна (HWND) в процессе изменение режима осведомленности о DPI больше не поддерживается. Если вы задаете режим осведомленности по умолчанию по умолчанию по умолчанию, необходимо вызвать соответствующий API перед созданием HWND.

Существует несколько API, которые позволяют указать осведомленность о DPI по умолчанию для процесса. Текущий рекомендуемый API — SetProcessDpiAwarenessContext, так как старые API предлагают меньше функциональных возможностей.

API Минимальная версия Windows DPI не знает Учет системного DPI Учет DPI для каждого монитора
SetProcessDPIAware Windows Vista Н/П SetProcessDPIAware() Н/П
SetProcessDpiAwareness Windows 8.1 SetProcessDpiAwareness(PROCESS_DPI_UNAWARE) SetProcessDpiAwareness(PROCESS_SYSTEM_DPI_AWARE) SetProcessDpiAwareness(PROCESS_PER_MONITOR_DPI_AWARE)
SetProcessDpiAwarenessContext Windows 10, версия 1607 SetProcessDpiAwarenessContext(DPI_AWARENESS_CONTEXT_UNAWARE) SetProcessDpiAwarenessContext(DPI_AWARENESS_CONTEXT_SYSTEM_AWARE)

SetProcessDpiAwarenessContext(DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE)

SetProcessDpiAwarenessContext(DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE_V2)

По умолчанию process-default vs. Thread по умолчанию

В этом документе описывается настройка осведомленности о DPI по умолчанию для процесса. Это связано с тем, что Windows 10 представила поддержку запуска нескольких режимов осведомленности о DPI в рамках одного процесса (до Windows 10 весь процесс должен соответствовать одному режиму осведомленности DPI). Поддержка запуска нескольких режимов осведомленности о DPI в процессе называется "масштабированием DPI в смешанном режиме". При использовании масштабирования DPI в смешанном режиме в процессе каждое окно верхнего уровня может выполняться в режиме осведомленности о DPI, который может отличаться от масштаба процесса по умолчанию. Если не указано явно, каждый поток будет по умолчанию по умолчанию обрабатывать при создании. Дополнительные сведения о масштабировании DPI в смешанном режиме см . в статье API масштабирования и поддержки DPI в смешанном режиме.