Exemplo n.º 1
0
        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);
        }
Exemplo n.º 2
0
        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
            });
        }