2009-08-26 3 views
2

In meiner Anwendung, erhalte ich die Bildschirmauflösung mit diesem Code:Verändert Aero die DPI- und Bildschirmgröße? Warum?

SystemInformation.PrimaryMonitorSize 

Und ich die DPI mit diesem Code erhalten:

using (Graphics g = Graphics.FromHdc(NativeMethods.GetDC(IntPtr.Zero))) 
    { 
     dpiX = g.DpiX; 
     dpiY = g.DpiY; 
    } 

Dies funktioniert in den meisten Situationen gut. Wenn der Code jedoch auf einem Vista-Computer ausgeführt wird, auf dem Aero aktiviert ist und der Benutzer den Monitor auf hohe DPI-Werte eingestellt hat, werden bizarre Ergebnisse zurückgegeben.

sagen wir der Benutzer die Maschine eingestellt wurde bei 1024 x 768 laufen und hat die bei 144 DPI, oberhalb der Code wird eine Auflösung von 683 x 512 DPI und der 96.

jedoch zurück, wenn Aero ist ausgeschaltet, die Ergebnisse kommen zurück, als ich sie erwarten würde. Was macht Aero und wie kann ich die wahre Auflösung und DPI bekommen?

Antwort

7

Sie müssen declare your application as DPI-aware entweder im Manifest (bevorzugt) oder unter Verwendung der Win32-API-Funktion SetProcessDPIAware. Da so viele Anwendungen nicht richtig geschrieben werden, hat Vista die "DPI-Virtualisierung" hinzugefügt, die Anwendungen vorgibt, mit einem "normalen" 96-dpi-Bildschirm zu arbeiten, und dann die Skalierung selbst durchführt - DWM, ein Compositing-Fenstermanager die Skalierung. Wenn Ihre Anwendung DPI richtig verarbeitet, müssen Sie dies explizit angeben.

Auf einer Randnotiz sollten Sie nicht mit HWND_DESKTOP Mist (was ist (HWND)0 ist). Wenn Compositing ("Aero") ausgeschaltet ist, stellt es tatsächlich den physischen Bildschirm dar. Wenn Sie also dessen DC abrufen und darauf zeichnen, zeichnen Sie direkt in den Framebuffer. Mit einem Compositing Window Manager ist dies unmöglich by definition. Ich bin mir nicht sicher, ob dies DPI Messung beeinflusst, aber es könnte eine bessere Idee zu verwenden, um die DC für Anwendungsfenster statt sowieso - es nicht/

+0

+1 Dies ist genau richtig. Microsoft hat es aufgegeben, Entwickler zu bitten, ihre Anwendungen bei anderen dpi-Einstellungen als 96dpi richtig zu machen. Anstatt die meisten Anwendungen zu unterbrechen, wenn der Benutzer High-dpi wählt, haben die Entwickler nun angegeben, dass sie High-dpi unterstützen. Der Benutzer kann weiterhin die Skalierung pro Programm deaktivieren (Rechtsklick, Registerkarte Kompatibilität) –