モニター、ディスプレイの一覧(解像度含む)取得
ディスプレイクラス
class Display { [DllImport( "user32.dll" )] static extern bool EnumDisplaySettings( string deviceName, int modeNum, ref DEVMODE devMode ); [DllImport( "user32.dll" )] static extern bool EnumDisplayDevices( string lpDevice, uint iDevNum, ref DISPLAY_DEVICE lpDisplayDevice, uint dwFlags ); public string DeviceName { get; private set; } public string DeviceString { get; private set; } public string MonitorName { get; private set; } public List<Resolution> Resolutions { get; private set; } public static List<Display> CreateDisplayList() { var list = new List<Display>(); var device = new DISPLAY_DEVICE(); device.cb = Marshal.SizeOf( device ); for ( uint i = 0; EnumDisplayDevices( null, i, ref device, 1 ); i++ ) { if ( ( device.StateFlags & DisplayDeviceStateFlags.MirroringDriver ) == DisplayDeviceStateFlags.MirroringDriver ) { continue; } list.Add( GetDisplay( device ) ); } return list; } private static Display GetDisplay( DISPLAY_DEVICE device ) { var monitor = new DISPLAY_DEVICE(); monitor.cb = Marshal.SizeOf( monitor ); EnumDisplayDevices( device.DeviceName, 0, ref monitor, 0 ); var display = new Display( device, monitor ); return display; } Display () { } Display( DISPLAY_DEVICE device, DISPLAY_DEVICE monitor ) { DeviceName = device.DeviceName; DeviceString = device.DeviceString; MonitorName = monitor.DeviceString; FillResolutions(); } void FillResolutions() { Resolutions = new List<Resolution>(); DEVMODE devMode = new DEVMODE(); for ( int i = 0; EnumDisplaySettings( DeviceName, i, ref devMode ); i++ ) { Resolutions.Add( new Resolution( devMode ) ); } } }
解像度とかディスプレイの詳細
class Resolution { public Size Size { get; private set; } public int Frequency { get; private set; } public int BitsPerPixel { get; private set; } public Resolution( DEVMODE devMode ) { Size = new Size( devMode.dmPelsWidth, devMode.dmPelsHeight ); Frequency = devMode.dmDisplayFrequency; BitsPerPixel = devMode.dmBitsPerPel; } }
class Program { static void Main( string[] args ) { var list = Display.CreateDisplayList(); foreach ( var item in list ) { Console.WriteLine( item.DeviceString ); Console.WriteLine( item.MonitorName ); foreach ( var resolution in item.Resolutions ) { Console.WriteLine("\tSize:{0} Color:{1} Frequency:{2}" , resolution.Size , resolution.BitsPerPixel , resolution.Frequency ); } } } }
その他、定義とか。pinvokeのコピペ。
[StructLayout( LayoutKind.Sequential, CharSet = CharSet.Ansi )] public struct DISPLAY_DEVICE { [MarshalAs( UnmanagedType.U4 )] public int cb; [MarshalAs( UnmanagedType.ByValTStr, SizeConst = 32 )] public string DeviceName; [MarshalAs( UnmanagedType.ByValTStr, SizeConst = 128 )] public string DeviceString; [MarshalAs( UnmanagedType.U4 )] public DisplayDeviceStateFlags StateFlags; [MarshalAs( UnmanagedType.ByValTStr, SizeConst = 128 )] public string DeviceID; [MarshalAs( UnmanagedType.ByValTStr, SizeConst = 128 )] public string DeviceKey; } [Flags] public enum DisplayDeviceStateFlags { None = 0, /// <summary>The device is part of the desktop.</summary> AttachedToDesktop = 0x1, MultiDriver = 0x2, /// <summary>The device is part of the desktop.</summary> PrimaryDevice = 0x4, /// <summary>Represents a pseudo device used to mirror application drawing for remoting or other purposes.</summary> MirroringDriver = 0x8, /// <summary>The device is VGA compatible.</summary> VGACompatible = 0x16, /// <summary>The device is removable; it cannot be the primary display.</summary> Removable = 0x20, /// <summary>The device has more display modes than its output devices support.</summary> ModesPruned = 0x8000000, Remote = 0x4000000, Disconnect = 0x2000000, } [StructLayout( LayoutKind.Explicit, CharSet = CharSet.Ansi )] struct DEVMODE { public const int CCHDEVICENAME = 32; public const int CCHFORMNAME = 32; [MarshalAs( UnmanagedType.ByValTStr, SizeConst = CCHDEVICENAME )] [FieldOffset( 0 )] public string dmDeviceName; [FieldOffset( 32 )] public Int16 dmSpecVersion; [FieldOffset( 34 )] public Int16 dmDriverVersion; [FieldOffset( 36 )] public Int16 dmSize; [FieldOffset( 38 )] public Int16 dmDriverExtra; [FieldOffset( 40 )] public DevmodeFields dmFields; [FieldOffset( 44 )] Int16 dmOrientation; [FieldOffset( 46 )] Int16 dmPaperSize; [FieldOffset( 48 )] Int16 dmPaperLength; [FieldOffset( 50 )] Int16 dmPaperWidth; [FieldOffset( 52 )] Int16 dmScale; [FieldOffset( 54 )] Int16 dmCopies; [FieldOffset( 56 )] Int16 dmDefaultSource; [FieldOffset( 58 )] Int16 dmPrintQuality; [FieldOffset( 44 )] public POINTL dmPosition; [FieldOffset( 52 )] public Int32 dmDisplayOrientation; [FieldOffset( 56 )] public Int32 dmDisplayFixedOutput; [FieldOffset( 60 )] public short dmColor; [FieldOffset( 62 )] public short dmDuplex; [FieldOffset( 64 )] public short dmYResolution; [FieldOffset( 66 )] public short dmTTOption; [FieldOffset( 68 )] public short dmCollate; [FieldOffset( 72 )] [MarshalAs( UnmanagedType.ByValTStr, SizeConst = CCHFORMNAME )] public string dmFormName; [FieldOffset( 102 )] public Int16 dmLogPixels; [FieldOffset( 104 )] public Int32 dmBitsPerPel; [FieldOffset( 108 )] public Int32 dmPelsWidth; [FieldOffset( 112 )] public Int32 dmPelsHeight; [FieldOffset( 116 )] public Int32 dmDisplayFlags; [FieldOffset( 116 )] public Int32 dmNup; [FieldOffset( 120 )] public Int32 dmDisplayFrequency; } [Flags] enum DevmodeFields { Orientation = 0x1, PaperSize = 0x2, PaperLength = 0x4, PaperWidth = 0x8, Scale = 0x10, Position = 0x20, NUP = 0x40, DisplayOrientation = 0x80, Copies = 0x100, DefaultSource = 0x200, PrintQuality = 0x400, Color = 0x800, Duplex = 0x1000, YResolution = 0x2000, TTOption = 0x4000, Collate = 0x8000, FormName = 0x10000, LogPixels = 0x20000, BitsPerPixel = 0x40000, PelsWidth = 0x80000, PelsHeight = 0x100000, DisplayFlags = 0x200000, DisplayFrequency = 0x400000, ICMMethod = 0x800000, ICMIntent = 0x1000000, MediaType = 0x2000000, DitherType = 0x4000000, PanningWidth = 0x8000000, PanningHeight = 0x10000000, DisplayFixedOutput = 0x20000000 } struct POINTL { public Int32 x; public Int32 y; }
設定はChangeDisplaySettingsEx
win7での設定はSetDisplayConfigとからしい
別フォーマット。きれい。SetDisplayConfig function (winuser.h) | Microsoft Docs