Résoudre les problèmes des applications Winforms récentes ou anciennes liés aux écrans à haut DPI
Le problème quand on utilise WinForms sur des PC modernes, c'est qu'il faut savoir s'adapter à des matériels modernes. L'un des problèmes qui reviennent le plus souvent est lié aux écrans à haut DPI. Le facteur de zoom appliqué à Windows est parfois mal géré par le couple Windows + WinForms. On peut avoir des comportements étranges :
- Une fenêtre / Form change de taille toute seule.
- Une fenêtre / Form semble avoir des contrôles plus gros qu'une autre.
- Le facteur de zoom ne semble pas être appliqué de la même manière sur tous les contrôles et toutes les fenêtres / Form.
- Plus tout un tas de problèmes qui impactent l'accessibilité.
Dans le cas où vous mixez WinForms et WPF, ces problèmes sont accentués.
Dans la plupart des cas, le problème se résout en ajoutant la ligne suivante à la méthode Main, ou avant l'affichage de la première fenêtre / Form.
Application.SetHighDpiMode(HighDpiMode.SystemAware);
Pour une application .net core récente, cette ligne n'est pas utile, car elle est appelée par la méthode:
ApplicationConfiguration.Initialize();
Si vous utilisez un vieux Framework .net, SetHighDpiMode ne sera peut-être pas disponible (ou efficace). Il faudra alors ajouter un fichier .manifest à votre application :
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0" xmlns:asmv3="urn:schemas-microsoft-com:asm.v3">
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">
<security>
<requestedPrivileges>
<requestedExecutionLevel level="asInvoker" uiAccess="false"/>
</requestedPrivileges>
</security>
</trustInfo>
<asmv3:application>
<asmv3:windowsSettings>
<dpiAware xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">false</dpiAware>
</asmv3:windowsSettings>
</asmv3:application>
</assembly>