public static DISPLAYCONFIG_SOURCE_DEVICE_NAME InitializeNew()
            {
                var result = new DISPLAYCONFIG_SOURCE_DEVICE_NAME()
                {
                    viewGdiDeviceName = new char[CCHDEVICENAME],
                    header            = new DISPLAYCONFIG_DEVICE_INFO_HEADER()
                    {
                        size = (uint)Marshal.SizeOf <DISPLAYCONFIG_SOURCE_DEVICE_NAME>()
                    }
                };

                return(result);
            }
        private static string GDI(LUID adapterId, uint sourceId)
        {
            DISPLAYCONFIG_SOURCE_DEVICE_NAME deviceName = new DISPLAYCONFIG_SOURCE_DEVICE_NAME();

            deviceName.header.size      = (uint)Marshal.SizeOf(typeof(DISPLAYCONFIG_SOURCE_DEVICE_NAME));
            deviceName.header.adapterId = adapterId;
            deviceName.header.id        = sourceId;
            deviceName.header.type      = DISPLAYCONFIG_DEVICE_INFO_TYPE.DISPLAYCONFIG_DEVICE_INFO_GET_SOURCE_NAME;
            int error = DisplayConfigGetDeviceInfo(ref deviceName);

            if (error != ERROR_SUCCESS)
            {
                throw new Win32Exception(error);
            }
            return(deviceName.viewGdiDeviceName);
        }
Esempio n. 3
0
        private static string MonitorSourceName(LUID adapterId, uint targetId)
        {
            DISPLAYCONFIG_SOURCE_DEVICE_NAME deviceName = new DISPLAYCONFIG_SOURCE_DEVICE_NAME()
            {
                header =
                {
                    size      = (uint)Marshal.SizeOf(typeof(DISPLAYCONFIG_SOURCE_DEVICE_NAME)),
                    adapterId = adapterId,
                    id        = targetId,
                    type      = DISPLAYCONFIG_DEVICE_INFO_TYPE.DISPLAYCONFIG_DEVICE_INFO_GET_SOURCE_NAME
                }
            };
            int deviceInfo = DisplayConfigGetDeviceInfo(ref deviceName);

            if ((uint)deviceInfo > 0U)
            {
                throw new Win32Exception(deviceInfo);
            }
            return(deviceName.viewGdiDeviceName);
        }
Esempio n. 4
0
        public static void SetHDRState(bool enabled, string displayName = null)
        {
            uint pathCount, modeCount;

            var err = NativeMethods.GetDisplayConfigBufferSizes(QueryDisplayFlags.OnlyActivePaths, out pathCount, out modeCount);

            if (err == NativeConstants.ERROR_SUCCESS)
            {
                var pathsArray = new DisplayConfigPathInfo[pathCount];
                var modesArray = new DisplayConfigModeInfo[modeCount];

                DisplayConfigTopologyId displayTopology;

                err = NativeMethods.QueryDisplayConfig(QueryDisplayFlags.DatabaseCurrent, ref pathCount, pathsArray, ref modeCount, modesArray, out displayTopology);
                if (err == NativeConstants.ERROR_SUCCESS)
                {
                    foreach (var path in pathsArray)
                    {
                        // get display name
                        var info = new DISPLAYCONFIG_SOURCE_DEVICE_NAME();
                        info.header.type      = DISPLAYCONFIG_DEVICE_INFO_TYPE.DISPLAYCONFIG_DEVICE_INFO_GET_SOURCE_NAME;
                        info.header.size      = Marshal.SizeOf <DISPLAYCONFIG_SOURCE_DEVICE_NAME>();
                        info.header.adapterId = path.sourceInfo.adapterId;
                        info.header.id        = path.sourceInfo.id;

                        err = NativeMethods.DisplayConfigGetDeviceInfo(ref info);
                        if (err != NativeConstants.ERROR_SUCCESS)
                        {
                            break;
                        }

                        var deviceName = info.viewGdiDeviceName;
                        if (displayName != null && !EqualDisplayNames(deviceName, displayName))
                        {
                            continue;
                        }

                        var setpacket = new DISPLAYCONFIG_SET_ADVANCED_COLOR_INFO();
                        setpacket.header      = new DISPLAYCONFIG_DEVICE_INFO_HEADER();
                        setpacket.header.type = DISPLAYCONFIG_DEVICE_INFO_TYPE.DISPLAYCONFIG_DEVICE_INFO_SET_ADVANCED_COLOR_STATE;
                        setpacket.header.size = Marshal.SizeOf <DISPLAYCONFIG_SET_ADVANCED_COLOR_INFO>();;

                        var requestpacket = new DISPLAYCONFIG_GET_ADVANCED_COLOR_INFO();
                        requestpacket.header      = new DISPLAYCONFIG_DEVICE_INFO_HEADER();
                        requestpacket.header.type = DISPLAYCONFIG_DEVICE_INFO_TYPE.DISPLAYCONFIG_DEVICE_INFO_GET_ADVANCED_COLOR_INFO;
                        requestpacket.header.size = Marshal.SizeOf <DISPLAYCONFIG_GET_ADVANCED_COLOR_INFO>();;

                        for (int i = 0; i < modeCount; i++)
                        {
                            if (modesArray[i].infoType == DisplayConfigModeInfoType.Target)
                            {
                                setpacket.header.adapterId     = modesArray[i].adapterId;
                                setpacket.header.id            = modesArray[i].id;
                                requestpacket.header.adapterId = modesArray[i].adapterId;
                                requestpacket.header.id        = modesArray[i].id;

                                if (NativeMethods.DisplayConfigGetDeviceInfo(ref requestpacket) == NativeConstants.ERROR_SUCCESS)
                                {
                                    if (requestpacket.advancedColorSupported)
                                    {
                                        setpacket.enableAdvancedColor = enabled ? 1U : 0;
                                        NativeMethods.DisplayConfigSetDeviceInfo(ref setpacket);
                                    }
                                }
                            }
                        }
                    }
                }
            }

            if (err != NativeConstants.ERROR_SUCCESS)
            {
                throw new Win32Exception(err);
            }
        }
Esempio n. 5
0
 public static extern int DisplayConfigGetDeviceInfo(ref DISPLAYCONFIG_SOURCE_DEVICE_NAME requestPacket);
 public static extern int DisplayConfigGetDeviceInfo(
     ref DISPLAYCONFIG_SOURCE_DEVICE_NAME deviceName
     );
Esempio n. 7
0
        public static ShaderHdrMetadata GetHdrMetadataForMonitor(string deviceName)
        {
            var err = BetterWin32Errors.Win32Error.ERROR_SUCCESS;
            // TODO: also query monitor HDR white point brightness (currently hardcoded to 800.0f)
            var hdrMetadata = new ShaderHdrMetadata {
                EnableHdrProcessing = false, MonSdrDispNits = 80.0f, ExposureLevel = 1.0f, MonHdrDispNits = 800.0f
            };
            var  monAdvColorInfo          = DISPLAYCONFIG_GET_ADVANCED_COLOR_INFO.CreateGet();
            var  monSdrWhiteLevel         = DISPLAYCONFIG_SDR_WHITE_LEVEL.CreateGet();
            uint numPathArrayElements     = 0;
            uint numModeInfoArrayElements = 0;

            err = GdiInterop.GetDisplayConfigBufferSizes(QDC_CONSTANT.QDC_ONLY_ACTIVE_PATHS,
                                                         ref numPathArrayElements, ref numModeInfoArrayElements);
            if (err != BetterWin32Errors.Win32Error.ERROR_SUCCESS)
            {
                throw new System.ComponentModel.Win32Exception((int)err);
            }

            var displayPathInfoArray = new DISPLAYCONFIG_PATH_INFO[numPathArrayElements];
            var displayModeInfoArray = new DISPLAYCONFIG_MODE_INFO[numModeInfoArrayElements];

            err = GdiInterop.QueryDisplayConfig(QDC_CONSTANT.QDC_ONLY_ACTIVE_PATHS,
                                                ref numPathArrayElements, displayPathInfoArray,
                                                ref numModeInfoArrayElements, displayModeInfoArray, IntPtr.Zero);
            if (err != BetterWin32Errors.Win32Error.ERROR_SUCCESS)
            {
                throw new System.ComponentModel.Win32Exception((int)err);
            }

            for (uint pathIdx = 0; pathIdx < numPathArrayElements; pathIdx++)
            {
                DISPLAYCONFIG_SOURCE_DEVICE_NAME srcName = DISPLAYCONFIG_SOURCE_DEVICE_NAME.CreateGet();
                srcName.header.adapterId.HighPart = displayPathInfoArray[pathIdx].sourceInfo.adapterId.HighPart;
                srcName.header.adapterId.LowPart  = displayPathInfoArray[pathIdx].sourceInfo.adapterId.LowPart;
                srcName.header.id = displayPathInfoArray[pathIdx].sourceInfo.id;

                err = GdiInterop.DisplayConfigGetDeviceInfo(ref srcName);
                if (err != BetterWin32Errors.Win32Error.ERROR_SUCCESS)
                {
                    throw new System.ComponentModel.Win32Exception((int)err);
                }

                if (srcName.DeviceName == deviceName)
                {
                    // If matches, proceed to query color information
                    monAdvColorInfo.header.adapterId.HighPart = displayPathInfoArray[pathIdx].targetInfo.adapterId.HighPart;
                    monAdvColorInfo.header.adapterId.LowPart  = displayPathInfoArray[pathIdx].targetInfo.adapterId.LowPart;
                    monAdvColorInfo.header.id = displayPathInfoArray[pathIdx].targetInfo.id;

                    monSdrWhiteLevel.header.adapterId.HighPart = displayPathInfoArray[pathIdx].targetInfo.adapterId.HighPart;
                    monSdrWhiteLevel.header.adapterId.LowPart  = displayPathInfoArray[pathIdx].targetInfo.adapterId.LowPart;
                    monSdrWhiteLevel.header.id = displayPathInfoArray[pathIdx].targetInfo.id;

                    err = GdiInterop.DisplayConfigGetDeviceInfo(ref monAdvColorInfo);
                    if (err != BetterWin32Errors.Win32Error.ERROR_SUCCESS)
                    {
                        throw new System.ComponentModel.Win32Exception((int)err);
                    }

                    hdrMetadata.EnableHdrProcessing = (monAdvColorInfo.AdvancedColorStatus & AdvancedColorStatus.AdvancedColorEnabled) == AdvancedColorStatus.AdvancedColorEnabled;
                    if (hdrMetadata.EnableHdrProcessing)
                    {
                        err = GdiInterop.DisplayConfigGetDeviceInfo(ref monSdrWhiteLevel);
                        if (err != BetterWin32Errors.Win32Error.ERROR_SUCCESS)
                        {
                            throw new System.ComponentModel.Win32Exception((int)err);
                        }

                        hdrMetadata.MonSdrDispNits = monSdrWhiteLevel.SDRWhiteLevelInNits;
                    }

                    break;
                }
            }

            return(hdrMetadata);
        }