private static IEnumerable <MonitorDeviceEdidInfoNative> EnumerateMonitorEdidDevicesImpl() { var info = new Collection <MonitorDeviceEdidInfoNative>(); var GUID_DEVCLASS_MONITOR = GuidDevClass.GUID_DEVCLASS_MONITOR; var canContinue = true; while (canContinue) { IntPtr devInfo = SetupApi.NativeMethods.SetupDiGetClassDevsEx( ref GUID_DEVCLASS_MONITOR, // class GUID null, // enumerator IntPtr.Zero, // HWND SetupApi.DiGetClassFlags.DIGCF_PRESENT, // Flags IntPtr.Zero, // device info, create a new one null, // machine name, local machine IntPtr.Zero); if (devInfo == IntPtr.Zero) { canContinue = false; } if (!canContinue) { break; } for (uint i = 0; Marshal.GetLastWin32Error() != Win32ErrorCode.ERROR_NO_MORE_ITEMS; i++) { SetupApi.SP_DEVINFO_DATA devInfoData = SetupApi.SP_DEVINFO_DATA.Empty; bool deviceInfoSuccess = SetupApi.NativeMethods.SetupDiEnumDeviceInfo(devInfo, i, ref devInfoData); if (!deviceInfoSuccess) { canContinue = false; } if (!canContinue) { continue; } MonitorDeviceEdidInfoNative candidate = GetMonitorDeviceEdidInfo(devInfo, devInfoData); var canAdd = candidate.IsValid && candidate != MonitorDeviceEdidInfoNative.NoValid; if (canAdd) { info.Add(candidate); } } } return(info); }
private static MonitorDeviceEdidInfoNative GetMonitorDeviceEdidInfo(IntPtr devInfo, SetupApi.SP_DEVINFO_DATA devInfoData) { uint instanceIdSize = 0; IntPtr instanceIdSizePointer = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(uint))); Marshal.StructureToPtr(instanceIdSize, instanceIdSizePointer, false); var instanceId = new char[256]; bool deviceInstanceSuccess = SetupApi.NativeMethods.SetupDiGetDeviceInstanceId( devInfo, ref devInfoData, instanceId, 256, instanceIdSizePointer); if (!deviceInstanceSuccess) { return(MonitorDeviceEdidInfoNative.NoValid); } byte[] instanceIdBytes = Encoding.Unicode.GetBytes(instanceId, 0, instanceId.Length); uint instanceIdSizeValue = ((uint)Marshal.PtrToStructure(instanceIdSizePointer, typeof(uint)) - 1) << 1; string instanceIdString = Encoding.Unicode.GetString(instanceIdBytes, 0, (int)instanceIdSizeValue); IntPtr edidRegKey = SetupApi.NativeMethods.SetupDiOpenDevRegKey( devInfo, ref devInfoData, 1, //NativeConstants.DICS_FLAG_GLOBAL, 0, 1, //NativeConstants.DIREG_DEV, 0x20019); //NativeConstants.KEY_READ); uint edidSize = 128; var edidData = new byte[edidSize]; uint regQuerySuccess = Registry.NativeMethods.RegQueryValueEx( edidRegKey, "EDID", IntPtr.Zero, IntPtr.Zero, edidData, ref edidSize); if (regQuerySuccess != Win32ErrorCode.ERROR_SUCCESS) { return(MonitorDeviceEdidInfoNative.NoValid); } return(new MonitorDeviceEdidInfoNative { DeviceId = instanceIdString, IsValid = !Array.TrueForAll(edidData, y => y == 0), RawEdid = edidData }); }