Как использовать мой собственный файл манифеста и встроить его в исполняемый файл с помощью Visual Studio 2017?

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

Раздел "Инструмент манифеста" в свойствах конфигурации VS предоставляет только три параметра для DPI DPI Awareness: " Нет" ("Unaware"), " Hight DPI Aware" и " Per Monitor DPI Aware" (который, кажется, PerMonitorV1), поэтому мне нужно найти способ переопределить эти настройки DPI, но я не знаю как это сделать. (Мое лучшее предположение заключается в том, чтобы как-то предоставить свой собственный файл манифеста, а не полагаться на Visual Studio для его создания.)

1 ответ

Решение

В настройках инструмента манифеста вы можете определить дополнительный фрагмент манифеста, который Visual Studio объединит со стандартным. Манифест по умолчанию будет по-прежнему предоставлять <dpiAware> тег, чтобы служить запасным вариантом для старых версий ОС, которые не понимают <dpiAwareness> тег.

шаги:

  1. Откройте конфигурацию проекта, выберите "Инструмент манифеста"> "Ввод и вывод".
  2. В поле "Дополнительные файлы манифеста" введите имя файла фрагмента манифеста, который вы хотите включить. Путь относительно вашей папки проекта.

    Фрагмент выглядит следующим образом. Обратите внимание, что я удалил <dpiAware> тег из образца MSDN:

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
      <application xmlns="urn:schemas-microsoft-com:asm.v3">
        <windowsSettings>
          <dpiAwareness xmlns="http://schemas.microsoft.com/SMI/2016/WindowsSettings">PerMonitorV2</dpiAwareness>
        </windowsSettings>
      </application>
    </assembly>
    
  3. В выпадающем списке "DPI Awareness" выберите "High DPI Awareness". Как написано выше, это запасное значение для более старых версий Windows.

Результат:

Это объединенный манифест для проекта Win32, который я создал с помощью мастера приложений. Он встроен в ресурсы приложения.

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

Если вы получите два <dpiAware> теги, вы забыли удалить <dpiAware> из фрагмента манифеста.

Другие вопросы по тегам