Как установить свойство dpiAware в манифесте приложения Windows для каждого монитора в Visual Studio?

Мне нужно иметь возможность установить для свойства dpiAware в манифесте моего приложения значение «на каждый монитор». Доступные варианты в свойствах — это просто включить или отключить знание DPI. Ни одна из этих настроек не работает для меня. Я могу получить желаемое поведение для своего приложения, если не встрою манифест в exe, а затем отредактирую манифест вручную. Я хочу автоматически сгенерировать и внедрить манифест. Есть ли что-то, что мне не хватает? (Я использую Visual Studio 2013.)


person Wayne    schedule 08.05.2014    source источник


Ответы (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, даже если это немного утомительно для больших проектов)

person dyasta    schedule 16.05.2017
comment
Спасибо за ваше редактирование IInspectable, я, по-видимому, сделал это из какого-то плохого манифеста, который у меня был. Одно слово предостережения для любого пользователя: если вы ошибетесь в манифесте, вы буквально сделаете свое приложение неработоспособным из-за «ошибки параллельной конфигурации». - person dyasta; 09.06.2017

Этот манифест работает, и <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>
person Warren P    schedule 10.11.2014
comment
В VS 2013 вам не нужны элементы UAC, поскольку они добавляются автоматически, как и элементы dpiAware. Вам нужны только GUID совместимости. Обратите внимание, что в этом примере указан только GUID Windows 8.1. См. эту запись в блоге. - person Chuck Walbourn; 08.07.2017
comment
Отсутствие атрибута 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
Манифесты приложений

person tambre    schedule 08.07.2017
comment
Ребята, вы знаете что-нибудь об этих настройках в развертываниях clickonce, вызывающих ошибки? - person Rubens Farias; 02.08.2019