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); }
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); }
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); } }
public static extern int DisplayConfigGetDeviceInfo(ref DISPLAYCONFIG_SOURCE_DEVICE_NAME requestPacket);
public static extern int DisplayConfigGetDeviceInfo( ref DISPLAYCONFIG_SOURCE_DEVICE_NAME deviceName );
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); }