Festlegen der standardmäßigen DPI-Erkennung für einen Prozess

Desktopanwendungen unter Windows können in verschiedenen DPI-Erkennungsmodi ausgeführt werden. Diese Modi ermöglichen unterschiedliche DPI-Skalierungsverhalten und können unterschiedliche Koordinatenräume verwenden. Weitere Informationen zur DPI-Erkennung finden Sie unter Desktopanwendungsentwicklung mit hohem DPI-Wert unter Windows. Es ist wichtig, dass Sie den standardmäßigen DPI-Erkennungsmodus Ihres Prozesses explizit festlegen, um unerwartetes Verhalten zu vermeiden.

Es gibt zwei Standard Methoden, um die Standard-DPI-Erkennung eines Prozesses anzugeben:

1) über eine Anwendungsmanifesteinstellung

2) programmgesteuert über einen API-Aufruf

Es wird empfohlen, die Dpi-Erkennung des Standardprozesses über eine Manifesteinstellung anzugeben. Die Angabe der Standardeinstellung über die API wird zwar unterstützt, es wird jedoch nicht empfohlen.

Festlegen der Standarderkennung mit dem Anwendungsmanifest

Es gibt zwei Manifesteinstellungen, mit denen Sie den Standard-DPI-Bewusstseinsmodus für den Prozess angeben können: <dpiAwareness> und <dpiAware>. <dpiAware> wurde in Windows Vista eingeführt und ermöglicht nur, dass ihr Prozess standardmäßig auf System awareness festgelegt wird. <dpiAwareness> wurde in Windows 10, Version 1607, eingeführt und ermöglicht es Ihnen, eine geordnete Liste der prozessstandardbasierten DPI-Erkennungsmodi anzugeben. Dadurch können Sie sicherungsspezifische DPI-Sensibilisierungsmodi festlegen, die verwendet werden, wenn Ihre Anwendung unter einer Version von Windows ausgeführt wird, die den ersten angegebenen Sensibilisierungsmodus nicht unterstützen kann. In älteren Versionen von Windows wird das neuere <tag dpiAwareness> ignoriert. Dies bedeutet, dass Sie beide Manifesteinstellungen verwenden können, um ein Szenario zu aktivieren, in dem ihr Prozess unter einer älteren Version von Windows standardmäßig system awareness sein kann, während Per-Monitor auf Versionen größer als Windows 10, Version 1607, ist. Unter Windows 10 version 1607 und on wird die <dpiAware-Einstellung> ignoriert, wenn das <dpiAwareness-Element> vorhanden ist.

In der folgenden Tabelle wird gezeigt, wie Sie mithilfe der beiden Manifesteinstellungen verschiedene Prozessstandard-DPI-Sensibilisierungsmodi angeben:

Verarbeiten des standardmäßigen DPI-Erkennungsmodus <dpiAware-Einstellung> <dpiAwareness-Einstellung> (Windows 10, Version 1607 und höher)
Nicht bekannt

N/V (keine dpiAware-Einstellung im Manifest)

oder

<dpiAware>false</dpiAware>

<dpiAwareness>unaware/<dpiAwareness>
Systemfähig <dpiAware>true</dpiAware> <dpiAwareness-System></dpiAwareness>
Pro Monitor <dpiAware>true/pm<dpiAware> <dpiAwareness>PerMonitor</dpiAwareness>
Pro Monitor V2 Nicht unterstützt <dpiAwareness>PerMonitorV2</dpiAwareness>

 

Das folgende Beispiel zeigt sowohl die <dpiAwareness>- als auch die dpiAware-Einstellungen>, die <in derselben Manifestdatei verwendet werden, um das Prozessstandard-DPI-Erkennungsverhalten für verschiedene Versionen von Windows zu konfigurieren.

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

Programmgesteuertes Festlegen der Standarderkennung

Obwohl dies nicht empfohlen wird, ist es möglich, die standardmäßige DPI-Erkennung programmgesteuert festzulegen. Sobald ein Fenster (ein HWND) in Ihrem Prozess erstellt wurde, wird das Ändern des DPI-Sensibilisierungsmodus nicht mehr unterstützt. Wenn Sie den Prozessstandard-DPI-Erkennungsmodus programmgesteuert festlegen, müssen Sie die entsprechende API aufrufen, bevor HWNDs erstellt wurden.

Es gibt mehrere APIs, mit denen Sie die Standard-DPI-Erkennung für Ihren Prozess angeben können. Die derzeit empfohlene API ist SetProcessDpiAwarenessContext, da ältere APIs weniger Funktionen bieten.

 

API Mindestversion von Windows DPI nicht bekannt System-DPI-Erkennung Pro Monitor DPI-fähig
SetProcessDPIAware Windows Vista SetProcessDPIAware()
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)

 

Prozessstandard im Vergleich zu Threadstandard

Dieses Dokument bezieht sich auf das Festlegen der Standard-DPI-Erkennung für Ihren Prozess. Dies liegt daran, dass Windows 10 Unterstützung für die Ausführung mehrerer DPI-Sensibilisierungsmodus innerhalb eines einzelnen Prozesses eingeführt hat (vor Windows 10 musste der gesamte Prozess einem einzelnen DPI-Erkennungsmodus entsprechen). Die Unterstützung für die Ausführung von mehr als einem DPI-Sensibilisierungsmodus innerhalb eines Prozesses wird als "DPI-Skalierung im gemischten Modus" bezeichnet. Wenn Sie die DPI-Skalierung im gemischten Modus in Ihrem Prozess verwenden, kann jedes Fenster der obersten Ebene in einem DPI-Erkennungsmodus ausgeführt werden, der sich von dem des Standardprozesses unterscheiden kann. Sofern nicht explizit angegeben, wird für jeden Thread bei der Erstellung standardmäßig der Prozessstandard verwendet. Weitere Informationen zur DPI-Skalierung im gemischten Modus finden Sie im Artikel Dpi-Skalierung im gemischten Modus .