3
votes

Définition de «Remplacer la mise à l'échelle DPI élevée» sur «Système (amélioré)» par programme ou avec un manifeste (MinGW)

J'ai essayé toutes les combinaisons possibles de gdiScaling et dpiAware , toujours pas de chance.

Si je clique manuellement avec le bouton droit de la souris sur app.exe et que je définis "Remplacer la mise à l'échelle DPI élevée" sur "Système (amélioré)", cela fonctionne très bien.

<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>


4 commentaires

@ magicandre1981 n'a pas aidé


ok, j'ai extrait le manifeste de mmc.exe et cela doit fonctionner car il fonctionne pour le gestionnaire de périphériques dans Windows 10.


Essayez de vous déconnecter de Windows et de vous reconnecter, redémarrez l'application avec les nouveaux paramètres DPI.


Le paramètre de compatibilité amélioré du système est stocké dans le registre HKCU \ Software \ Microsoft \ Windows NT \ CurrentVersion \ AppCompatFlags \ Layers (ou HKLM si vous souhaitez qu'il soit à l'échelle de la machine). Il existe une clé avec le chemin de l'application et une chaîne: superuser.com/questions/1230346/... . De plus, de nombreux frameworks utilisés pour développer l'interface utilisateur essaient de faire des choses «intelligentes» qui gênent parfois Windows. Cela peut donc dépendre de votre application, de la manière dont elle est écrite, etc.


3 Réponses :


0
votes
<?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>
And make sure you don't have a dpiAwareness tag at all. Check for manifest merging; strings works adequately for inspecting the manifest of the final binary. The dpiAware tag contents are case sensitive. However, since false is the default if the tag is missing, I am lead to believe that rather SetProcessDpiAware or SetProcessDpiAwareness is being called by something. Check with strings to verify that you have no references to SetProcessDpiAware.You could attempt to fight fire with fire by a call to SetProcessDpiAwareness(PROCESS_DPI_UNAWARE); right before you create your first window; however this is a bad idea.All information is drawn from MSDN Setting the default DPI awareness for a process, MSDN SetProcessDPIAwareness, and personal experience dealing with this material.

0 commentaires

2
votes

Essayez ce manifeste:

#define DPI_AWARENESS_CONTEXT_UNAWARE_GDISCALED    ((DPI_AWARENESS_CONTEXT)-5)

il est extrait de MMC.exe de Windows 10 1809 qui héberge le gestionnaire de périphériques et cela doit fonctionner :

La console de gestion Microsoft (mmc.exe) sera mise à l'échelle GDI, par par défaut, dans la mise à jour des créateurs. Cela signifie que de nombreuses fenêtres intégrées les composants logiciels enfichables, tels que le Gestionnaire de périphériques, bénéficieront de cette fonctionnalité dans la mise à jour des créateurs.

Si cela ne fonctionne pas non plus, activez-le via le code avec Fonction SetProcessDpiAwarenessContext et DPI_AWARENESS_CONTEXT_UNAWARE_Gode est défini dans "Inclure \ 10.0.BUILDNUMBER.0 \ shared \ windef.h" comme

<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>


8 commentaires

Merci pour cela. Cela devrait vraiment fonctionner. Mon hello.rc est 1 24 "hello.exe.manifest" , je le compile avec i686-w64-mingw32-windres hello.rc -O coff -o hello.res , puis j'ajoute hello.res à la liste d'arguments gcc.


Mais ce n'est pas le cas.


utilisez resourcehacker pour voir si le manifeste est ajouté correctement.


si cela ne fonctionne pas non plus, activez-le via le code avec la fonction SetProcessDpiAwarenessContext et DPI_AWARENESS_CONTEXT_UNAWARE_GDISCALED


essayez également de compiler le code avec l'édition communautaire VS2017, peut-être avez-vous rencontré un bogue MinGW


Mon windef.h n'a pas DPI_AWARENESS_CONTEXT_UNAWARE_GDISCALED, pourriez-vous s'il vous plaît écrire sa valeur?


Je le vois dans \ Include \ 10.0.17763.0 \ shared \ windef.h avec #define DPI_AWARENESS_CONTEXT_UNAWARE_GDISCALED ((DPI_AWARENESS_CONTEXT) -5)


à nouveau, installez VS2017 avec le SDK Win10 17763 pour avoir les en-têtes à jour.



0
votes

Assurez-vous que votre identifiant de manifeste est 1. J'ai réussi à le faire fonctionner avec Dev-C ++ 5.11 / MinGW 4.9.2 avec un .exe nommé win32opengl.exe. Voici le contenu de mon fichier:

resource.h

<?xml version="1.0" encoding="UTF-8"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
  <asmv3:application xmlns:asmv3="urn:schemas-microsoft-com:asm.v3">
    <asmv3:windowsSettings xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">
      <dpiAware>true</dpiAware>
    </asmv3:windowsSettings>
  </asmv3:application>
</assembly>

resource.rc

#include "resource.h"
ID_MANIFEST 24  "win32opengl.exe.manifest"

win32opengl.exe.manifest

#ifndef RESOURCE_H
#define RESOURCE_H
#define ID_MANIFEST 1
#endif


0 commentaires