2013-08-12 14 views
9

C'è un modo per ottenere la risoluzione nativa di uno schermo in C#?Ottieni risoluzione nativa dello schermo

La ragione per cui chiedo è che ho alcune curve ed è molto importante che abbiano lo stesso aspetto indipendentemente dalla risoluzione. Quando lo schermo non è in risoluzione nativa, hanno un aspetto leggermente diverso rispetto a prima e voglio mostrare un avvertimento che è così.

+0

È necessario prendere in conto il rapporto di aspetto quando si disegna la curva. –

+0

C# non è rilevante, si utilizza .NET e WinForms o WPF. –

+0

Ok scusa, sto usando .NET con WPF. – Mathias

risposta

3

Dalla mia esperienza la soluzione migliore è quella di estrarre le informazioni dai monitor EDID

come ottenere la risoluzione nativa di soluzione: How to fetch the NATIVE resolution of attached monitor from EDID file through VB6.0?

ho fatto un piccolo javascript che ottiene la risoluzione degli 8 byte a partire da 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); 

e qui è una versione 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

provare qualcosa di simile: -

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

Per ottenere la risoluzione corrente dello schermo è possibile utilizzare: -

Rectangle resolution = Screen.PrimaryScreen.Bounds; 

Ora per cambiare la risoluzione.

Controllare questo link.

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

Current! = Native – Corak

+0

Il mio Macbook Retina Apple ha una risoluzione nativa di 2880x1800. L'ho scelto nelle impostazioni di risoluzione. Tuttavia, dal momento che Windows lo ridimensiona perché è DPI alto 'Screen class' mi dice che la risoluzione è 1440x900. Il problema è che DWM dice anche che il DPI è 96, che nella maggior parte dei casi va bene, ma se hai bisogno di sapere che la risoluzione nativa 'Screen' non può aiutarti. –

3

In WinForms è possibile utilizzare uno dei

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

e uno schermo ha una Bounds (lordo) e un WorkingArea (netto) Rettangolo.

A pensarci bene, questo vi dirà solo la risoluzione corrente. Questo dovrebbe essere abbastanza però, come è stato commentato, vuoi davvero conoscere le proporzioni.

+0

Tuttavia non è solo la risoluzione corrente? Voglio sapere la risoluzione consigliata (il numero effettivo di pixel di uno schermo LCD) per quella schermata, se esiste. – Mathias

+0

@Mathias - Vedere questo [collegamento] (http://bytes.com/topic/c-sharp/answers/821321-there-any-way-get-monitor-native-resolution). "Alcuni monitor hanno una risoluzione nativa, altri no: se si tratta di un monitor LCD, la risoluzione nativa è la più alta risoluzione supportata e, se si tratta di un monitor CRT, non ha una risoluzione nativa." – Corak

+0

Sì, si ottiene solo la risoluzione "corrente". Sei sicuro che sia tua responsabilità persino rilevare diverse impostazioni? Sembra una caratteristica insinuante. –

3

In genere, la risoluzione massima è la risoluzione nativa per i display LCD. Tuttavia, non è sempre il caso. Se riusciamo a fare leva là, ottenere le Risoluzioni Max dovrebbe essere sufficiente.

Risoluzione massima può essere ottenuto utilizzando:

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