Bildschirmauflösung stimmt nicht mit Screen.Bounds überein

8

Ich sehe einen interessanten Unterschied zwischen der Auflösung, die über die Systemsteuerung eingestellt wird, und der Ausgabe von Screen.Bounds für meinen Breitbild-Laptop. Der Bildschirm ist 15,5 "und die Auflösung von Systemsteuerung ist 1920x1080. Wenn ich jedoch Code wie folgt ausführen.

%Vor%

Die Ausgabe zeigt meine Auflösung von 1536x864. Ich habe mich etwas umgeschaut, und ich dachte, es könnte mit einem DPI-Problem zusammenhängen, und wenn ich mir meine Anzeigeeinstellungen anschaue, ist der Schieberegler (ich bin auf Windows 8.1) in der Mitte und das Kontrollkästchen "Lass mich Wählen Sie eine Skalierungsstufe für alle meine Anzeigen "ist deaktiviert. Ich habe diesen kleinen Code ausgeführt, um die aktuelle DPI-Einstellung zu erhalten.

%Vor%

Die DPI, die zurückgegeben wird, ist 96.0, was meiner Meinung nach die 100% DPI-Einstellung ist (also keine Vergrößerung oder wie auch immer es genannt wird). Was mir seltsam vorkommt ist, dass die von Screen zurückgegebenen Grenzen genau 80% meiner tatsächlichen Auflösung sind, was mich denken lässt, dass meine DPI auf 100 (oder 125%) gesetzt ist, aber das ist es nicht. Ich habe nur dieses Problem mit meinem Laptop-Bildschirm, da mein sekundärer Monitor Grenzen hat, die Auflösung über die Systemsteuerung entsprechen. Liegt das daran, dass meine DPI-Einstellung nicht so eingestellt ist, dass die Displays unabhängig voneinander sind (dieses Kontrollkästchen aktiviert)? Für ein bisschen Hintergrund schreibe ich ein Werkzeug, das die aktuellen Bildschirme nimmt und Bilder von reddit bekommt und sie unabhängig voneinander auf die Bildschirme bringt, also muss ich, egal welche Lösung ich habe, die Auflösung jedes Displays korrekt ermitteln.

    
Isaac Levin 16.01.2015, 15:17
quelle

2 Antworten

9

Ich hatte dasselbe Problem auch für Screenshot-Tool. Ich habe eine Lösung gefunden und es funktioniert für mich.

%Vor%

Sie sollten die SetDpiAwareness () -Methode vor Aufruffunktionen aufrufen, um die Systemauflösung usw. zu erhalten. Wenn Sie jetzt eine Benutzeroberfläche in Ihrer Anwendung haben, liegt es in Ihrer Verantwortung, die Benutzeroberfläche auf dem Bildschirm mit hoher DPI zu skalieren.

Hoffe, das hilft.

    
name1ess0ne 08.03.2015 06:40
quelle
3

Ich glaube, dass Sie dem Betriebssystem mitteilen müssen, dass Ihre Anwendung DPI-fähig ist. Ansonsten gibt das OS vor, dass alles in Ordnung ist, was zu dem Verhalten führt, das Sie beobachten - das OS nimmt die Größenänderung vor.

Hier finden Sie Informationen zum Schreiben von DPI-fähigen Anwendungen - Ссылка Natürlich sollte sicherstellen, dass Ihre Anwendung tatsächlich ist DPI-bewusst - wenn nicht, bleiben Sie besser bei der Standardeinstellung. Es ist nicht so schön, aber zumindest wird es funktionieren.

Der Hauptunterschied zu Windows 8.1 besteht darin, dass Sie auf verschiedenen Monitoren unterschiedliche DPI-Werte haben und die Monitor-DPI-API abfragen können. .NET (und speziell WPF) behandelt die DPI-Erkennung standardmäßig automatisch, jedoch nur auf der Grundlage der System-DPI. Wenn Ihre Monitore unterschiedliche DPI-Einstellungen haben, verhält sie sich nicht DPI-fähig (genauer gesagt, System-DPI-fähig, aber das Endergebnis ist, dass Ihre Anwendungsgrafiken von Windows virtualisiert werden). Ich würde erwarten, dass, wenn Sie Ihre zweite Anzeige trennen, Ihre Anwendung sich wie erwartet auf Ihrem einzigen Display verhalten würde (zumindest nach der manuellen Einstellung der DPI, unabhängig vom Wert).

    
Luaan 16.01.2015 16:24
quelle

Tags und Links