Мне нужно иметь возможность установить для свойства dpiAware в манифесте моего приложения значение «на каждый монитор». Доступные варианты в свойствах — это просто включить или отключить знание DPI. Ни одна из этих настроек не работает для меня. Я могу получить желаемое поведение для своего приложения, если не встрою манифест в exe, а затем отредактирую манифест вручную. Я хочу автоматически сгенерировать и внедрить манифест. Есть ли что-то, что мне не хватает? (Я использую Visual Studio 2013.)
Как установить свойство dpiAware в манифесте приложения Windows для каждого монитора в Visual Studio?
Ответы (3)
Новым в Windows 10 является dpiAwareness, а также dpiAware, поэтому нам нужно немного обновить этот пример. Теперь все в порядке, потому что если dpiAwareness не существует, то настройки будут унаследованы от dpiAware.
Чтобы включить поддержку DPI в полном объеме, с последней поддержкой Win10 (см. Ref URL для других возможных параметров), включая «permonitor» и «permonitorv2», которые я буду использовать вместо «система», потому что ваш вопрос задает его.
<asmv3:application>
<asmv3:windowsSettings>
<dpiAware xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">true/pm</dpiAware> <!-- legacy -->
<dpiAwareness xmlns="http://schemas.microsoft.com/SMI/2016/WindowsSettings">permonitorv2,permonitor</dpiAwareness> <!-- falls back to pm if pmv2 is not available -->
</asmv3:windowsSettings>
</asmv3:application>
Чтобы отключить, вы должны сделать обратное (нет необходимости в dpiAwareness
, так как мы его не поддерживаем):
<asmv3:application>
<asmv3:windowsSettings>
<dpiAware xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">unaware</dpiAware>
</asmv3:windowsSettings>
</asmv3:application>
Тогда есть даже «gdiScaling», если вам случится использовать объекты GDI для рисования некоторых ваших собственных вещей.
<asmv3:application>
<asmv3:windowsSettings>
<gdiScaling xmlns="http://schemas.microsoft.com/SMI/2017/WindowsSettings">true</gdiScaling>
</asmv3:windowsSettings>
</asmv3:application>
Ссылка: Microsoft о поддержке DPI в последней сборке Windows 10 (также есть руководства о том, как сделать ваш код осведомленным о DPI, даже если это немного утомительно для больших проектов)
Этот манифест работает, и <dpiAware>True/PM</dpiAware>
самая важная часть:
<?xml version="1.0" encoding="utf-8"?>
<asmv1:assembly manifestVersion="1.0" xmlns="urn:schemas-microsoft-com:asm.v1" xmlns:asmv1="urn:schemas-microsoft-com:asm.v1" xmlns:asmv2="urn:schemas-microsoft-com:asm.v2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<assemblyIdentity version="1.0.0.0" name="MyApplication.app"/>
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">
<security>
<requestedPrivileges xmlns="urn:schemas-microsoft-com:asm.v3">
<requestedExecutionLevel level="asInvoker" uiAccess="false" />
</requestedPrivileges>
</security>
</trustInfo>
<compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">
<application>
<supportedOS Id="{1f676c76-80e1-4239-95bb-83d0f6d0da78}"/>
</application>
</compatibility>
<asmv3:application xmlns:asmv3="urn:schemas-microsoft-com:asm.v3">
<asmv3:windowsSettings
xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">
<dpiAware>True/PM</dpiAware>
</asmv3:windowsSettings>
</asmv3:application>
</asmv1:assembly>
dpiAware
. Вам нужны только GUID совместимости. Обратите внимание, что в этом примере указан только GUID Windows 8.1. См. эту запись в блоге.
- person Chuck Walbourn; 08.07.2017
xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings"
внутри тега <windowsSettings>
приводит к тому, что приложение не запускается. Это не указано в MS документация по осведомленности о DPI. Спасибо что подметил это.
- person Vinz; 03.06.2018
В Windows 10 1607 было введено новое свойство с именем dpiAwareness
. Он позволяет выбрать резервные параметры масштабирования DPI и переопределяет свойство dpiAware
, если оно присутствует. Для лучшей совместимости следует указать оба из них и убедиться, что ваше приложение работает со всеми уровнями поддержки DPI.
Следующий манифест включает поддержку DPI для каждого монитора версии 2 в Windows 10 1607+ и системную поддержку DPI в Windows 7+:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly manifestVersion="1.0" xmlns="urn:schemas-microsoft-com:asm.v1" xmlns:asmv3="urn:schemas-microsoft-com:asm.v3">
<assemblyIdentity type="win32" name="MyApplication" version="1.0.0.0" processorArchitecture="amd64"/>
<asmv3:application>
<asmv3:windowsSettings>
<dpiAware xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">true/pm</dpiAware> <!-- fallback for Windows 7 and 8 -->
<dpiAwareness xmlns="http://schemas.microsoft.com/SMI/2016/WindowsSettings">PerMonitorV2</dpiAwareness> <!-- adding v1 as fallback would result in v2 not being applied to dialogs on capable systems -->
<gdiScaling xmlns="http://schemas.microsoft.com/SMI/2017/WindowsSettings">true</gdiScaling> <!-- enables GDI DPI scaling -->
</asmv3:windowsSettings>
</asmv3:application>
</assembly>
Чтобы отключить распознавание DPI, вы можете либо просто оставить распознавание DPI неуказанным (по умолчанию не учитывается), либо указать dpiAware
как false
.
Также обратите внимание на свойство gdiScaling
, которое было добавлено в Windows 10 1607. Оно включает автоматическое масштабирование GDI, если установлено значение true
. Это очень полезно, если ваше приложение использует GDI для рисования.
Ссылки:
Масштабирование с высоким разрешением, начиная с Windows 10 1607
Написание приложений с поддержкой DPI
Манифесты приложений