モニター、ディスプレイの一覧(解像度含む)取得

ディスプレイクラス

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