2013-08-12 8 views
9

Gibt es eine Möglichkeit, die native Auflösung eines Bildschirms in C# zu erhalten?Get native Auflösung des Bildschirms

Der Grund, warum ich frage, ist, dass ich einige Kurven habe und es sehr wichtig ist, dass sie gleich aussehen, egal welche Auflösung. Wenn der Bildschirm nicht in nativer Auflösung ist, sehen sie etwas anders aus als zuvor und ich möchte eine Warnung anzeigen, dass dies der Fall ist.

+0

Sie müssen in nehmen Sie das Seitenverhältnis zu berücksichtigen, wenn Sie Ihre Kurve zu zeichnen. –

+0

C# ist nicht relevant, Sie verwenden .NET und entweder WinForms oder WPF. –

+0

Ok Entschuldigung, ich benutze .NET mit WPF. – Mathias

Antwort

3

Aus meiner Erfahrung die beste Lösung EDID

Wie diese Informationen von den Monitoren zu extrahieren ist die native Auflösung in beantwortet bekommen: How to fetch the NATIVE resolution of attached monitor from EDID file through VB6.0?

Ich habe ein kleines Javascript, das die Auflösung aus den 8 Bytes ab 54 erhält.

var dtd = 0; 
var edid = new Uint8Array(8); 
var i = 0; 

edid[i++] = 0x0E; 
edid[i++] = 0x1F; 
edid[i++] = 0x00; 
edid[i++] = 0x80; 
edid[i++] = 0x51; 
edid[i++] = 0x00; 
edid[i++] = 0x1B; 
edid[i++] = 0x30; 

var horizontalRes = ((edid[dtd+4] >> 4) << 8) | edid[dtd+2] ; 
var verticalRes = ((edid[dtd+7] >> 4) << 8) | edid[dtd+5]; 
console.log(horizontalRes+", "+verticalRes); 

und hier ist eine C# Version:

static Point ExtractResolution(byte [] edid) 
    { 
     const int dtd = 54; 
     var horizontalRes = ((edid[dtd + 4] >> 4) << 8) | edid[dtd + 2]; 
     var verticalRes = ((edid[dtd + 7] >> 4) << 8) | edid[dtd + 5]; 
     return new Point(horizontalRes, verticalRes); 
    } 
3

versuchen, etwas wie folgt aus: -

GraphicsAdapter.DefaultAdapter.CurrentDisplayMode.Width 
GraphicsAdapter.DefaultAdapter.CurrentDisplayMode.Height 

Um die aktuelle Auflösung des Bildschirms erhalten Sie verwenden können: -

Rectangle resolution = Screen.PrimaryScreen.Bounds; 

nun für die Auflösung zu ändern.

Überprüfen Sie diese link.

Screen screen = Screen.PrimaryScreen; 
int S_width=screen.Bounds.Width; 
int S_height=screen.Bounds.Height; 
+3

Aktuell! = Native – Corak

+0

Mein Apple Macbook Retina hat eine native Auflösung von 2880x1800. Ich habe das in den Auflösungseinstellungen gewählt. Aber da Windows es skaliert, weil es hohe DPI "Screen class" sagt mir die Auflösung ist 1440x900. Das Problem ist, dass DWM auch sagt, dass die DPI 96 ist, was in den meisten Fällen in Ordnung ist, aber wenn Sie wissen müssen, dass die native Auflösung "Screen" Ihnen nicht helfen kann. –

3

In WinForms können Sie eine von

var someScreen = Screen.AllScreens[i]; 
var mainScreen = Screen.PrimaryScreen; 

verwenden und ein Bildschirm hat eine Bounds (brutto) und eine working (netto) Rechteck.

Auf den zweiten Gedanken, dies wird Ihnen nur die aktuelle Auflösung sagen. Das sollte aber genug sein, wie bereits erwähnt wurde, dass Sie das Seitenverhältnis wirklich wissen wollen.

+0

Ist das nicht nur die aktuelle Auflösung? Ich möchte die empfohlene Auflösung (die tatsächliche Anzahl von Pixeln eines LCD-Bildschirms) für diesen Bildschirm wissen, wenn es existiert. – Mathias

+0

@Mathias - Siehe [link] (http://bytes.com/topic/c-sharp/answers/821321-there-any-way-get-monitor-native-resolution). "Einige Monitore haben eine native Auflösung, andere nicht. Wenn es sich um einen LCD-Monitor handelt, ist die native Auflösung die höchste unterstützte Auflösung. Wenn es sich um einen CRT-Monitor handelt, hat es keine native Auflösung." – Corak

+0

Ja, Sie erhalten nur die 'aktuelle' Auflösung. Sind Sie sicher, dass es in Ihrer Verantwortung liegt, auch andere Einstellungen zu erkennen? Klingt nach Feature-Creep. –

3

Im Allgemeinen ist die maximale Auflösung die native Auflösung für LCD-Monitore. Das ist jedoch nicht immer der Fall. Wenn wir es dort einsetzen können, sollte es ausreichen, Max Resolutions zu bekommen.

Max Auflösung kann unter Verwendung erhalten:

[DllImport("user32.dll")] 
    private static extern int EnumDisplaySettings(string deviceName, int modeNum, ref DeviceMode devMode); 

    /// <summary> 
    /// Gets the max resolution + refresh rate supported by specific display 
    /// </summary> 
    /// <param name="deviceName">Device name(System.Windows.Forms.Screen.DeviceName)</param> 
    /// <param name="dispWidth">Width of the display</param> 
    /// <param name="dispHeight">Height of the display</param> 
    /// <param name="refreshRate">Refresh rate of the display</param> 
    /// <returns></returns> 
    public static void GetMaxResolutionWithRefreshRate(string deviceName, out int dispWidth, out int dispHeight, out int refreshRate) 
    { 
     dispWidth = dispHeight = refreshRate = 0; 
     DeviceMode deviceMode = new DeviceMode(); 
     for (int i = 0; Win32.EnumDisplaySettings(deviceName, i, ref deviceMode) != 0; i++) 
     { 
      if (deviceMode.dmPelsWidth > dispWidth || (deviceMode.dmPelsWidth == dispWidth && deviceMode.dmPelsHeight >= dispHeight && deviceMode.dmDisplayFrequency >= refreshRate)) 
      { 
       dispWidth = deviceMode.dmPelsWidth; 
       dispHeight = deviceMode.dmPelsHeight; 
       refreshRate = deviceMode.dmDisplayFrequency; 
      } 
     } 
    } 

public static void GetMaxResolutionWithRefreshRate(out int dispWidth, out int dispHeight, out int refreshRate) 
    { 
     GetMaxResolutionWithRefreshRate(null, out dispWidth, out dispHeight, out refreshRate); 
    } 
Verwandte Themen