Установка «Переопределить масштабирование с высоким разрешением» на «Система (улучшенная)» программно или с манифестом (MinGW) - PullRequest
2 голосов
/ 21 марта 2019

Я перепробовал все возможные комбинации gdiScaling и dpiAware, но все равно не повезло.

Если я вручную щелкну правой кнопкой мыши по app.exe и выберу «Переопределить масштабирование с высоким разрешением» на «Система (Улучшено)», отлично работает.

<assembly xmlns="urn:schemas-microsoft-com:asm.v1"  xmlns:asmv3="urn:schemas-microsoft-com:asm.v3" manifestVersion="1.0">
  <asmv3:application>
    <asmv3:windowsSettings xmlns="http://schemas.microsoft.com/SMI/2017/WindowsSettings">
      <gdiScaling>true</gdiScaling>
      <dpiAware>False</dpiAware>
    </asmv3:windowsSettings>
  </asmv3:application>

</assembly>

Ответы [ 2 ]

1 голос
/ 23 марта 2019

Попробуйте этот манифест:

<asmv3:application>
   <asmv3:windowsSettings>
        <dpiAware xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">false</dpiAware>
        <gdiScaling xmlns="http://schemas.microsoft.com/SMI/2017/WindowsSettings">true</gdiScaling>
   </asmv3:windowsSettings>
</asmv3:application>

он скопирован из MMC.exe Windows 10 1809, на котором размещается диспетчер устройств, и это должно работать :

Консоль управления Microsoft (mmc.exe) будет масштабироваться по GDI по умолчанию, в обновлении создателей. Это означает, что многие входящие в комплект поставки Windows оснастки, такие как диспетчер устройств, получат выгоду от этой функции в Обновление Создателей.

Если это также не работает, включите его через код с помощью SetProcessDpiAwarenessContext и DPI_AWARENESS_CONTEXT_UNAWARE_GDISCALED, который определен в "Include\10.0.BUILDNUMBER.0\shared\windef.h" как

#define DPI_AWARENESS_CONTEXT_UNAWARE_GDISCALED    ((DPI_AWARENESS_CONTEXT)-5)
0 голосов
/ 23 марта 2019
<?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>
        <dpiAware>false</dpiAware>
    </windowsSettings>
</application>
</assembly>

И убедитесь, что у вас вообще нет тега dpiAwareness. Проверьте на слияние манифеста; strings работает адекватно для проверки манифеста окончательного двоичного файла. Содержимое тега dpiAware чувствительно к регистру. Однако, так как false является значением по умолчанию, если тег отсутствует, я склонен считать, что скорее всего SetProcessDpiAware или SetProcessDpiAwareness вызывается чем-то. Обратитесь к strings, чтобы убедиться, что у вас нет ссылок на SetProcessDpiAware.

Вы можете попытаться потушить огонь огнем, позвонив по номеру SetProcessDpiAwareness(PROCESS_DPI_UNAWARE); прямо перед тем, как создать свое первое окно; Однако это плохая идея.

Вся информация взята из MSDN Установка осведомленности о DPI по умолчанию для процесса , MSDN SetProcessDPIAwareness и личного опыта работы с этим материалом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...