Festlegen des standardmäßigen DPI-Bewusstseins für einen Prozess
Desktopanwendungen unter Windows können in verschiedenen DPI-Bewusstseinsmodi ausgeführt werden. Diese Modi ermöglichen unterschiedliche DPI-Skalierungsverhalten und können unterschiedliche Koordinatenräume verwenden. Weitere Informationen zum DPI-Bewusstsein finden Sie unter Entwicklung von Desktopanwendungen mit hohen DPI-Werten unter Windows. Es ist wichtig, dass Sie den standardmäßigen DPI-Bewusstseinsmodus Ihres Prozesses explizit festlegen, um unerwartetes Verhalten zu vermeiden.
Es gibt zwei Hauptmethoden zum Angeben des standardmäßigen DPI-Bewusstseins für einen Prozess:
1) über eine Anwendungsmanifesteinstellung
2) programmgesteuert über einen API-Aufruf
Es wird empfohlen, den standardmäßigen DPI-Grad des Prozesses über eine Manifesteinstellung anzugeben. Die Angabe des Standardwerts über die API wird zwar unterstützt, wird jedoch nicht empfohlen.
Festlegen des Standardbewusstseins mit dem Anwendungsmanifest
Es gibt zwei Manifesteinstellungen, mit denen Sie den standardmäßigen DPI-Bewusstseinsmodus des Prozesses angeben können: <dpiAwareness> und <dpiAware>. <dpiAware> wurde in Windows Vista eingeführt und ermöglicht nur, dass Ihr Prozess standardmäßig auf den Systembewusstsein festgelegt wird. <dpiAwareness> wurde in Windows 10, Version 1607, eingeführt und ermöglicht Ihnen die Angabe einer sortierten Liste der Prozessstandard-DPI-Bewusstseinsmodi. Auf diese Weise können Sie Sicherungs-DPI-Sensibilisierungsmodi festlegen, die verwendet werden, wenn Ihre Anwendung in einer Windows-Version ausgeführt wird, die den ersten angegebenen Sensibilisierungsmodus nicht unterstützen kann. In älteren Versionen von Windows wird das neuere <dpiAwareness-Tag> ignoriert. Dies bedeutet, dass Sie beide Manifesteinstellungen verwenden können, um ein Szenario zu aktivieren, in dem ihr Prozessstandard auf älteren Versionen von Windows als "Per-Monitor" unter Windows 10, Version 1607, bekannt sein könnte. Unter Windows 10, Version 1607 und höher, wird die Einstellung <dpiAware> ignoriert, wenn das Element <dpiAwareness> vorhanden ist.
In der folgenden Tabelle wird gezeigt, wie Verschiedene Prozessstandard-DPI-Sensibilisierungsmodi mithilfe der beiden Manifesteinstellungen angegeben werden:
Prozessstandard-DPI-Bewusstseinsmodus | <dpiAware>-Einstellung | <dpiAwareness>-Einstellung (Windows 10, Version 1607 und höher) |
---|---|---|
Nicht bewusst | N/A (keine DPIAware-Einstellung im Manifest) or <dpiAware>false</dpiAware> |
<dpiAwareness>unaware</dpiAwareness> |
Systembewusst | <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, wie sowohl die Einstellungen<dpiAwareness> als auch <dpiAware> in derselben Manifestdatei verwendet werden, um das prozessstandardmäßige DPI-Bewusstseinserhalten für verschiedene Windows-Versionen 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 des Standardbewusstseins
Obwohl es nicht empfohlen wird, ist es möglich, das standardmäßige DPI-Bewusstsein programmgesteuert festzulegen. Nachdem ein Fenster (ein HWND) in Ihrem Prozess erstellt wurde, wird das Ändern des DPI-Sensibilisierungsmodus nicht mehr unterstützt. Wenn Sie den prozessbasierten DPI-Sensibilisierungsmodus programmgesteuert festlegen, müssen Sie die entsprechende API aufrufen, bevor HWNDs erstellt wurden.
Es gibt mehrere APIs, mit denen Sie den standardmäßigen DPI-Grad für Ihren Prozess angeben können. Die aktuelle empfohlene API ist SetProcessDpiAwarenessContext, da ältere APIs weniger Funktionalität bieten.
API | Mindestversion von Windows | DPI-Unaware | System-DPI-Erkennung | Monitorspezifisches DPI-Bewusstsein |
---|---|---|---|---|
SetProcessDPIAware | Windows Vista | N/V | SetProcessDPIAware() | N/V |
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 zum Threadstandard
Dieses Dokument bezieht sich auf das Festlegen des standardmäßigen DPI-Bewusstseins für Ihren Prozess. Dies liegt daran, dass Windows 10 die Unterstützung für die Ausführung mehrerer DPI-Bewusstseinsmodus in einem einzigen Prozess eingeführt hat (vor Windows 10 musste der gesamte Prozess einem einzelnen DPI-Bewusstseinsmodus entsprechen). Unterstützung für die Ausführung mehrerer DPI-Sensibilisierungsmodus innerhalb eines Prozesses wird als "DPI-Skalierung im gemischten Modus" bezeichnet. Wenn Sie die DPI-Skalierung im gemischten Modus innerhalb Des Prozesses verwenden, kann jedes Fenster auf oberster Ebene in einem DPI-Bewusstseinsmodus ausgeführt werden, der sich möglicherweise von der der Standardeinstellung des Prozesses unterscheidet. Sofern nicht explizit angegeben, wird jeder Thread standardmäßig auf den Prozessstandard festgelegt, wenn er erstellt wird. Weitere Informationen zur DPI-Skalierung im gemischten Modus finden Sie im Artikel zu DPI-Skalierung im Gemischten Modus und DPI-fähigen APIs .