using System; using System.Runtime.InteropServices; using UnityEngine; namespace FullscreenEditor.Windows { [System.Serializable] [StructLayout(LayoutKind.Sequential)] internal struct NativeRect { public int left; public int top; public int right; public int bottom; public static implicit operator Rect(NativeRect other) { return Rect.MinMaxRect( other.left, other.top, other.right, other.bottom ); } public static implicit operator NativeRect(Rect other) { return new NativeRect { left = (int)other.xMin, top = (int)other.yMin, right = (int)other.xMax, bottom = (int)other.yMax }; } } [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)] internal struct MonitorInfoEx { private const int CCHDEVICENAME = 0x20; public int size; public NativeRect monitor; public NativeRect work; public uint flags; [MarshalAs(UnmanagedType.ByValTStr, SizeConst = CCHDEVICENAME)] public string DeviceName; public void Init() { this.size = 40 + 1 * CCHDEVICENAME; this.DeviceName = string.Empty; } } [System.Serializable] [StructLayout(LayoutKind.Sequential)] internal struct DevMode { [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 0x20)] public string dmDeviceName; public short dmSpecVersion; public short dmDriverVersion; public short dmSize; public short dmDriverExtra; public int dmFields; public int dmPositionX; public int dmPositionY; public ScreenOrientation dmDisplayOrientation; public int dmDisplayFixedOutput; public short dmColor; public short dmDuplex; public short dmYResolution; public short dmTTOption; public short dmCollate; [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 0x20)] public string dmFormName; public short dmLogPixels; public int dmBitsPerPel; 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; } [Flags] internal enum DisplayDeviceStateFlags : int { /// The device is part of the desktop. AttachedToDesktop = 0x1, MultiDriver = 0x2, /// The device is part of the desktop. PrimaryDevice = 0x4, /// Represents a pseudo device used to mirror application drawing for remoting or other purposes. MirroringDriver = 0x8, /// The device is VGA compatible. VGACompatible = 0x10, /// The device is removable; it cannot be the primary display. Removable = 0x20, /// The device has more display modes than its output devices support. ModesPruned = 0x8000000, Remote = 0x4000000, Disconnect = 0x2000000 } [System.Serializable] [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)] internal struct DisplayDevice { [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; } }