2015-07-29 2 views
8

Unter Windows 10 erfordert das System keinen Neustart (Abmelden/Anmelden) mehr, um DPI (Textgröße) zu ändern.Handle-Laufzeitänderung von DPI (Textgröße) unter Windows 10

Meine Anwendung ist nicht bereit für eine solche Laufzeitänderung.

Wie informiert das System eine Anwendung, die das DPI ändert? Welche Nachricht sollte ich behandeln?


Ich bin mit C++ Builder, so dass ich bin auf der Suche nach einer reinen WinAPI Lösung, ohne WinForms.

+0

Kommentare sind nicht für längere Diskussion; Diese Konversation wurde [in den Chat verschoben] (http://chat.stackoverflow.com/rooms/84692/discussion-on-question-by-martin-prikryl-handle-runtime-change-of-dpi-text-size) . –

Antwort

8

Als @TLama und @DalijaPrasnikar commented ist die zu bearbeitende Nachricht .

#define WM_DPICHANGED  0x02E0 

Die Botschaft ist seit Windows 8.1 zur Verfügung, wo sie an ein Fenster gesendet wird, wenn das Fenster auf einem anderen Monitor mit einem anderen DPI bewegt wird.

Unter Windows 10 ist die Laufzeitänderung von DPI aus Sicht der API identisch mit dem Verschieben eines Fensters auf einen anderen Monitor mit anderer DPI (außer natürlich, dass in diesem Fall das Fenster auf demselben Monitor bleibt).

Um die Nachricht sogar zu empfangen (selbst für Laufzeit-DPI-Änderung unter Windows 10), muss die Anwendung die Unterstützung für DPI pro Monitor deklarieren. Der bevorzugte Weg ist, um declare the support in an application manifest von dpiAwareness-PerMonitorV2 Einstellung (und zusätzlichen PerMonitor Wert und setzte dpiAware zu True/PM für die Abwärtskompatibilität mit älteren Windows-10 baut und Windows 8.1):

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

Wenn die Anwendung pro-Monitor erklärt DPI Unterstützung , wird das System seine Fenster beim DPI-Laufzeitwechsel nicht pixelweise skalieren. Es liegt dann an der Anwendung, ihre Fenster nativ zu skalieren.

+1

Ich war es, der anfänglich auf die 'WM_DPICHANGED' Nachricht im (jetzt gelöschten) Kommentar hinwies. Ich habe es wegen des Hinweises gelöscht * "Die WM_DPICHANGED-Benachrichtigung wird nicht gesendet, wenn der Benutzer den Desktop-Skalierungswert in der Systemsteuerung ändert." * Aus [diesem Lernprogramm] (https://msdn.microsoft.com/en-us /library/windows/desktop/dd464659%28v=vs.85%29.aspx). – TLama

+1

In [diesem Tutorial] (https://msdn.microsoft.com/en-us/library/windows/desktop/dn469266%28v=vs.85%29.aspx) sagen sie jedoch über diese Nachricht * "Diese Benachrichtigung wird ausgelöst, wenn der Benutzer die Anwendung zwischen Monitoren mit unterschiedlicher DPI * *** verschiebt und wenn der Benutzer die DPI in der Systemsteuerung ändert. *** Damit sie sich widersprechen. – TLama

+0

@TLama Ich weiß, dass du das auch vorgeschlagen hast. Vielen Dank! Ich habe die Nachricht auf Windows 10 getestet und es funktioniert wie in meiner Antwort beschrieben. –