2013-08-12 20 views
9

Czy istnieje sposób na uzyskanie natywnej rozdzielczości ekranu w języku C#?Uzyskaj natywną rozdzielczość ekranu

Powodem, dla którego pytam, jest to, że mam pewne krzywe i bardzo ważne jest, aby wyglądały tak samo bez względu na rozdzielczość. Gdy ekran nie ma naturalnej rozdzielczości, wygląda nieco inaczej niż poprzednio i chcę pokazać ostrzeżenie, że tak jest.

+0

trzeba podjąć w celu uwzględnienia proporcje kiedy narysować krzywą. –

+0

C# nie jest istotne, używasz .NET i WinForm lub WPF. –

+0

OK przepraszam, używam .NET z WPF. – Mathias

Odpowiedz

3

Z mojego doświadczenia wynika, że ​​najlepszym rozwiązaniem jest, aby wyodrębnić te informacje od monitorów EDID

Jak się natywna rozdzielczość to odpowiedział: How to fetch the NATIVE resolution of attached monitor from EDID file through VB6.0?

Zrobiłem trochę javascript, który pobiera rozdzielczość z 8 bajtów, począwszy od 54.

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); 

i tutaj jest wersja C#:

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

spróbować czegoś takiego: -

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

Aby uzyskać bieżącą rozdzielczość ekranu można użyć: -

Rectangle resolution = Screen.PrimaryScreen.Bounds; 

teraz na zmianę rozdzielczości.

Sprawdź to link.

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

Bieżąca! = Natywna – Corak

+0

Moja siatkówka Apple Macbook ma rodzimą rozdzielczość 2880x1800. Wybrałem to w ustawieniach rozdzielczości. Jednak skoro Windows go skaluje, ponieważ jest to klasa '' Screen "o wysokiej rozdzielczości, mówi mi, że rozdzielczość wynosi 1440x900. Problem polega na tym, że DWM mówi również, że DPI to 96, co w większości przypadków jest w porządku, ale jeśli potrzebujesz znać natywną rozdzielczość, 'Screen' nie może ci pomóc. –

3

W WinForms można użyć jednego z

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

a ekran ma Bounds (brutto) i WorkingArea (netto) prostokąta.

Po krótkiej analizie powie tylko bieżącą rozdzielczość. To powinno jednak wystarczyć, ponieważ zostało już skomentowane, że naprawdę chcesz znać współczynnik proporcji.

+0

Czy nie jest to jednak tylko obecna rozdzielczość? Chcę znać zalecaną rozdzielczość (rzeczywista liczba pikseli ekranu LCD) dla tego ekranu, jeśli istnieje. – Mathias

+0

@Mathias - Zobacz ten [link] (http://bytes.com/topic/c-sharp/answers/821321-there-any-way-get-monitor-native-resolution). "Niektóre monitory mają rozdzielczość natywną, inne nie .Jeśli jest to monitor LCD, natywna rozdzielczość jest najwyższą obsługiwaną rozdzielczością.Jeśli jest to monitor CRT, nie ma rozdzielczości natywnej." – Corak

+0

Tak, otrzymujesz tylko "bieżącą" rozdzielczość. Czy jesteś pewien, że Twoim obowiązkiem jest nawet wykryć różne ustawienia? Brzmi jak pełzanie po pełnych funkcjach. –

3

Ogólnie rzecz biorąc, maksymalna rozdzielczość jest rodzimą rozdzielczością dla wyświetlaczy LCD. Jednak nie zawsze tak jest. Jeśli uda nam się tam wykorzystać, wystarcza uzyskanie maksymalnych rezolucji.

Maksymalna rozdzielczość można uzyskać za pomocą:

[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); 
    } 
Powiązane problemy