Définir la prise en charge DPI par défaut pour un processus

Les applications de bureau sur Windows peuvent fonctionner dans différents modes de prise en charge DPI. Ces modes permettent des comportements de mise à l’échelle DPI différents et peuvent utiliser des espaces de coordonnées différents. Pour plus d’informations sur la prise en charge DPI, veuillez consulter la section Développement d’applications de bureau à haute DPI sur Windows. Il est important de définir explicitement le mode de prise en charge DPI par défaut de votre processus afin d’éviter des comportements inattendus.

Il existe deux méthodes principales pour spécifier la prise en charge DPI par défaut d’un processus :

1) via un paramètre de manifeste d’application

2) par programmation via un appel d’API

Nous vous recommandons de spécifier la prise en charge DPI par défaut du processus via un paramètre de manifeste. Bien qu’il soit possible de spécifier la prise en charge par défaut via une API, cela n’est pas recommandé.

Définir la prise en charge par défaut avec le manifeste d’application

Il existe deux paramètres de manifeste qui vous permettent de spécifier le mode de prise en charge DPI par défaut du processus : <dpiAwareness> et <dpiAware>. <dpiAware> a été introduit dans Windows Vista et ne permet que de définir la prise en charge DPI par défaut de votre processus en tant que prise en charge système. <dpiAwareness> a été introduit dans Windows 10, version 1607, et vous permet de spécifier une liste ordonnée de modes de prise en charge DPI par défaut du processus. Cela vous permet de définir des modes de prise en charge DPI de secours, qui seront utilisés si votre application est exécutée sur une version de Windows incapable de prendre en charge le premier mode de prise en charge spécifié. Sur les anciennes versions de Windows, le tag <dpiAwareness> le plus récent sera ignoré. Cela signifie que vous pouvez utiliser ces deux paramètres de manifeste pour activer un scénario où la prise en charge DPI par défaut de votre processus pourrait être la prise en charge système sur une ancienne version de Windows, tout en étant Per-Monitor sur des versions supérieures à Windows 10, version 1607. Sur Windows 10, version 1607 et suivantes, le paramètre <dpiAware> est ignoré si l’élément <dpiAwareness> est présent.

Le tableau ci-dessous montre comment spécifier différents modes de prise en charge DPI par défaut du processus en utilisant les deux paramètres de manifeste :

Mode de prise en charge DPI par défaut du processus Paramètre <dpiAware> Paramètre <dpiAwareness>
(Windows 10, version 1607 et les versions suivantes)
unaware (non pris en charge) N/A (aucun paramètre dpiAware dans le manifeste)
or
<dpiAware>false</dpiAware>
<dpiAwareness>unaware</dpiAwareness>
Prise en charge système <dpiAware>true</dpiAware> <dpiAwareness>system</dpiAwareness>
Per Monitor <dpiAware>true/pm<dpiAware> <dpiAwareness>PerMonitor</dpiAwareness>
Per Monitor V2 Non pris en charge <dpiAwareness>PerMonitorV2</dpiAwareness>

 

L’exemple ci-dessous montre à la fois les paramètres <dpiAwareness> et <dpiAware> utilisés dans le même fichier manifeste pour configurer le comportement de prise en charge DPI par défaut du processus pour différentes versions de Windows.

<?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">
  <asmv3:application>
    <asmv3:windowsSettings>
      <dpiAware xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">true</dpiAware>
      <dpiAwareness xmlns="http://schemas.microsoft.com/SMI/2016/WindowsSettings">PerMonitorV2</dpiAwareness>
    </asmv3:windowsSettings>
  </asmv3:application>
</assembly>

Définir la prise en charge par défaut par programmation

Bien que cela ne soit pas recommandé, il est possible de définir la prise en charge DPI par défaut par programmation. Une fois qu’une fenêtre (un HWND) a été créée dans votre processus, il n’est plus possible de changer le mode de prise en charge DPI. Si vous définissez le mode de prise en charge DPI par défaut du processus par programmation, vous devez appeler l’API correspondante avant que des HWND ne soient créés.

Il existe plusieurs API qui vous permettent de spécifier la prise en charge DPI par défaut pour votre processus. L’API recommandée actuellement est SetProcessDpiAwarenessContext, car les anciennes API offrent moins de fonctionnalités.

API Version minimale de Windows Sans prise en charge des PPP Prise en charge DPI Système Prise en charge DPI Per Monitor
SetProcessDPIAware Windows Vista S/O SetProcessDPIAware() S/O
SetProcessDpiAwareness Windows 8.1 SetProcessDpiAwareness(PROCESS_DPI_UNAWARE) SetProcessDpiAwareness(PROCESS_SYSTEM_DPI_AWARE) SetProcessDpiAwareness(PROCESS_PER_MONITOR_DPI_AWARE)
SetProcessDpiAwarenessContext Windows 10, version 1607 SetProcessDpiAwarenessContext(DPI_AWARENESS_CONTEXT_UNAWARE) SetProcessDpiAwarenessContext(DPI_AWARENESS_CONTEXT_SYSTEM_AWARE)

SetProcessDpiAwarenessContext(DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE)

SetProcessDpiAwarenessContext(DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE_V2)

Prise en charge par défaut du processus vs. prise en charge par défaut du thread

Ce document fait référence à la définition de la prise en charge DPI par défaut pour votre processus. Cela est dû au fait que Windows 10 a introduit la prise en charge de l’exécution de plusieurs modes de prise en charge DPI au sein d’un même processus (avant Windows 10, l’ensemble du processus devait se conformer à un seul mode de prise en charge DPI). La prise en charge de l’exécution de plusieurs modes de prise en charge DPI au sein d’un processus est appelée « mise à l’échelle DPI en mode mixte ». Lorsque vous utilisez la mise à l’échelle DPI en mode mixte au sein de votre processus, chaque fenêtre de niveau supérieur peut fonctionner dans un mode de prise en charge DPI différent de celui du processus par défaut. Sauf indication contraire, chaque thread utilisera par défaut le mode de prise en charge DPI du processus lorsqu’il est créé. Pour plus d’informations sur la mise à l’échelle DPI en mode mixte, consultez l’article Mise à l’échelle DPI en mode mixte et API DPI-aware.