Koledzy powyżej myślą o jakiś dziwnych metodach. Napisałem przy pomocy p/invoke wiki i codeproject taką klasę (korzysta z WinApi, więc tylko dla Windows):
public static class DisplayModes
{
public static List<DisplayMode> GetDisplayModes()
{
List<DisplayMode> displayModes = new List<DisplayMode>();
DEVMODE devMode = new DEVMODE();
for (int i = 0; EnumDisplaySettings(null, i, ref devMode) != 0; i++)
{
displayModes.Add(new DisplayMode { Width = devMode.dmPelsWidth, Height = devMode.dmPelsHeight, Frequency = devMode.dmDisplayFrequency, Bits = devMode.dmBitsPerPel });
}
return displayModes;
}
public struct DisplayMode
{
public int Width;
public int Height;
public int Frequency;
public int Bits;
public override string ToString()
{
return Width.ToString() + "x" + Height.ToString() + "@" + Frequency.ToString() + " (" + Bits.ToString() + ")";
}
}
[DllImport("user32.dll")]
private static extern int EnumDisplaySettings(string deviceName, int modeNum, ref DEVMODE devMode);
[StructLayout(LayoutKind.Sequential)]
private struct DEVMODE
{
public const int CCHDEVICENAME = 32;
public const int CCHFORMNAME = 32;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = CCHDEVICENAME)]
public string dmDeviceName;
public short dmSpecVersion;
public short dmDriverVersion;
public short dmSize;
public short dmDriverExtra;
public int dmFields;
public short dmOrientation;
public short dmPaperSize;
public short dmPaperLength;
public short dmPaperWidth;
public short dmScale;
public short dmCopies;
public short dmDefaultSource;
public short dmPrintQuality;
public short dmColor;
public short dmDuplex;
public short dmYResolution;
public short dmTTOption;
public short dmCollate;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = CCHFORMNAME)]
public string dmFormName;
public short dmLogPixels;
public int dmBitsPerPel; // Declared wrong in the full framework
public int dmPelsWidth;
public int dmPelsHeight;
public int dmDisplayFlags;
public int dmDisplayFrequency;
public int dmICMMethod;
public int dmICMIntent;
public int dmMediaType;
public int dmDitherType;
public int dmReserved1;
public int dmReserved2;
public int dmPanningWidth;
public int dmPanningHeight;
public int dmPositionX; // Using a PointL Struct does not work
public int dmPositionY;
}
}
Używasz jej tak:
List<DisplayModes.DisplayMode> dm = DisplayModes.GetDisplayModes();
// szukane
int width = 1280;
int height = 800;
bool supported = dm.Exists((displayMode) => (displayMode.Width == width && displayMode.Height == height));