Festlegen der DPI-Standarderkennung für einen Prozess

Desktopanwendungen auf Windows können in verschiedenen DPI-Erkennungsmodi ausgeführt werden. Diese Modi ermöglichen ein anderes DPI-Skalierungsverhalten und können unterschiedliche Koordinatenräume verwenden. Weitere Informationen zur DPI-Erkennung finden Sie unter High DPI Desktop Application Development on Windows (Entwicklung von Desktopanwendungen mit hohem DPI-Anteil auf Windows). Es ist wichtig, dass Sie explizit den DPI-Standarderkennungsmodus Ihres Prozesses festlegen, um unerwartetes Verhalten zu vermeiden.

Es gibt zwei Hauptmethoden, um die DPI-Standarderkennung eines Prozesses anzugeben:

1 ) über eine Anwendungsmanifesteinstellung

2 ) programmgesteuert über einen API-Aufruf

Es wird empfohlen, die Standardmäßige Prozess-DPI-Kenntnis über eine Manifesteinstellung anzugeben. Die Angabe des Standardwerts über die API wird zwar unterstützt, wird jedoch nicht empfohlen.

Festlegen der Standarderkennung mit dem Anwendungsmanifest

Es gibt zwei Manifesteinstellungen, mit denen Sie den Standardmäßigen DPI-Prozesserkennungsmodus angeben können: <dpiAwareness> und <dpiAware> . <dpiAware>wurde in Windows Vista eingeführt und ermöglicht nur, dass der Prozessstandard auf Systemerkennung 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 Sicherungs-DPI-Erkennungsmodi festlegen, die verwendet werden, wenn Ihre Anwendung auf einer Version von ausgeführt wird Windows den ersten angegebenen Awareness-Modus nicht unterstützen können. Bei älteren Versionen von Windows wird das <dpiAwareness> neuere Tag ignoriert. Dies bedeutet, dass Sie beide Manifesteinstellungen verwenden können, um ein Szenario zu ermöglichen, in dem ihr Prozessstandard die Systemerkennung für eine ältere Version von Windows sein kann, während sie in Versionen größer als Windows 10 Version 1607 Per-Monitor wird. Bei Windows 10 Version 1607 und höher wird die <dpiAware> Einstellung ignoriert, wenn das <dpiAwareness> Element vorhanden ist.

In der folgenden Tabelle wird gezeigt, wie sie verschiedene Prozessstandard-DPI-Awareness-Modi mithilfe der beiden Manifesteinstellungen angeben:

Verarbeiten des DPI-Standarderkennungsmodus <>dpiAware-Einstellung <>dpiAwareness-Einstellung (Windows 10, Version 1607 und höher)
nicht bekannt

N/A (keine dpiAware-Einstellung im Manifest)

oder

<dpiAware > false < /dpiAware>

<dpiAwareness > unaware < /dpiAwareness>
Systemfähiges System <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 Einstellungen als auch <dpiAwareness> die <dpiAware> Einstellungen, die in derselben Manifestdatei verwendet werden, um das prozessstandardbasierte DPI-Bewusstseinsverhalten 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 DPI-Standarderkennung programmgesteuert festzulegen. Sobald ein Fenster (ein HWND) in Ihrem Prozess erstellt wurde, wird das Ändern des DPI-Erkennungsmodus nicht mehr unterstützt. Wenn Sie den Prozessstandard-DPI-Modus programmgesteuert festlegen, müssen Sie die entsprechende API aufrufen, bevor HWNDs erstellt wurden.

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

API Mindestversion von Windows DPI nicht bekannt System-DPI-fähigen DPI-fähige Daten pro Monitor
SetProcessDPIAware Windows Vista NICHT ZUTREFFEND SetProcessDPIAware() NICHT ZUTREFFEND
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 DPI-Standarderkennung für Ihren Prozess. Dies liegt daran, dass Windows 10 Unterstützung für die Ausführung mehrerer DPI-Awareness-Modi innerhalb eines einzelnen Prozesses eingeführt hat (vor Windows 10 musste der gesamte Prozess einem einzelnen DPI-Awareness-Modus entsprechen). Unterstützung für die Ausführung mehrerer DPI-Awareness-Modi innerhalb eines Prozesses wird als "DPI-Skalierung im gemischten Modus" bezeichnet. Wenn Sie die DPI-Skalierung im gemischten Modus innerhalb Ihres Prozesses verwenden, kann jedes Fenster der obersten Ebene in einem DPI-Modus ausgeführt werden, der sich von dem des Prozessstandardmodus unterscheidet. Sofern nicht explizit angegeben, wird bei der Erstellung für jeden Thread standardmäßig der Prozessstandard verwendet. Weitere Informationen zur DPI-Skalierung im gemischten Modus finden Sie im Artikel DPI-Skalierung im gemischten Modus.