Настройка осведомленности по умолчанию о 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 в смешанном режиме.