public static extern User32Status QueryDisplayConfig( QueryDeviceConfigFlags flags, ref uint pathArrayElements, [Out] DisplayConfigPathInfo[] pathInfoArray, ref uint modeInfoArrayElements, [Out] DisplayConfigModeInfo[] modeInfoArray, [Out] out DisplayConfigTopologyId currentTopologyId );
public static extern Win32Status GetDisplayConfigBufferSizes(QueryDeviceConfigFlags flags, out uint pathArrayElements, out uint modeInfoArrayElements);
public static extern int QueryDisplayConfig( QueryDeviceConfigFlags flags, ref uint numPathArrayElements, [Out] DisplayconfigPathInfo[] pathInfoArray, ref uint numModeInfoArrayElements, [Out] DisplayconfigModeInfo[] modeInfoArray, IntPtr currentTopologyId );
public static extern int GetDisplayConfigBufferSizes( QueryDeviceConfigFlags flags, out uint numPathArrayElements, out uint numModeInfoArrayElements);
private static PathInfo[] GetPathInfos(QueryDeviceConfigFlags flags, out DisplayConfigTopologyId topologyId) { DisplayConfigPathInfo[] displayPaths; DisplayConfigModeInfo[] displayModes; uint pathCount; while (true) { uint modeCount; var error = DisplayConfigApi.GetDisplayConfigBufferSizes(flags, out pathCount, out modeCount); if (error != Win32Status.Success) { throw new Win32Exception((int)error); } displayPaths = new DisplayConfigPathInfo[pathCount]; displayModes = new DisplayConfigModeInfo[modeCount]; if (flags == QueryDeviceConfigFlags.DatabaseCurrent) { error = DisplayConfigApi.QueryDisplayConfig(flags, ref pathCount, displayPaths, ref modeCount, displayModes, out topologyId); } else { topologyId = DisplayConfigTopologyId.None; error = DisplayConfigApi.QueryDisplayConfig(flags, ref pathCount, displayPaths, ref modeCount, displayModes, IntPtr.Zero); } if (error == Win32Status.Success) { break; } if (error != Win32Status.ErrorInsufficientBuffer) { throw new Win32Exception((int)error); } } var pathInfos = new Dictionary <uint, Tuple <DisplayConfigPathSourceInfo, DisplayConfigSourceMode?, List < Tuple <DisplayConfigPathInfoFlags, DisplayConfigPathTargetInfo, DisplayConfigTargetMode?, DisplayConfigDesktopImageInfo?> > > > (); var sourceId = uint.MaxValue; for (var i = 0u; i < pathCount; i++) { var displayPath = displayPaths[i]; DisplayConfigSourceMode?sourceMode = null; var key = sourceId; var isVirtualSupported = displayPath.Flags.HasFlag(DisplayConfigPathInfoFlags.SupportVirtualMode); if (isVirtualSupported && (displayPath.SourceInfo.SourceModeInfoIndex != DisplayConfigSourceMode.InvalidSourceModeIndex) && (displayModes[displayPath.SourceInfo.SourceModeInfoIndex].InfoType == DisplayConfigModeInfoType.Source)) { sourceMode = displayModes[displayPath.SourceInfo.SourceModeInfoIndex].SourceMode; key = displayPath.SourceInfo.SourceModeInfoIndex; } else if (!isVirtualSupported && (displayPath.SourceInfo.ModeInfoIndex != DisplayConfigModeInfo.InvalidModeIndex) && (displayModes[displayPath.SourceInfo.ModeInfoIndex].InfoType == DisplayConfigModeInfoType.Source)) { sourceMode = displayModes[displayPath.SourceInfo.ModeInfoIndex].SourceMode; key = displayPath.SourceInfo.ModeInfoIndex; } else { sourceId--; } if (!pathInfos.ContainsKey(key)) { pathInfos.Add(key, new Tuple <DisplayConfigPathSourceInfo, DisplayConfigSourceMode?, List < Tuple <DisplayConfigPathInfoFlags, DisplayConfigPathTargetInfo, DisplayConfigTargetMode?, DisplayConfigDesktopImageInfo?> > >( displayPath.SourceInfo, sourceMode, new List < Tuple <DisplayConfigPathInfoFlags, DisplayConfigPathTargetInfo, DisplayConfigTargetMode?, DisplayConfigDesktopImageInfo?> > ())); } DisplayConfigTargetMode?targetMode = null; if (isVirtualSupported && (displayPath.TargetInfo.TargetModeInfoIndex != DisplayConfigTargetMode.InvalidTargetModeIndex) && (displayModes[displayPath.TargetInfo.TargetModeInfoIndex].InfoType == DisplayConfigModeInfoType.Target)) { targetMode = displayModes[displayPath.TargetInfo.TargetModeInfoIndex].TargetMode; } else if (!isVirtualSupported && (displayPath.TargetInfo.ModeInfoIndex != DisplayConfigModeInfo.InvalidModeIndex) && (displayModes[displayPath.TargetInfo.ModeInfoIndex].InfoType == DisplayConfigModeInfoType.Target)) { targetMode = displayModes[displayPath.TargetInfo.ModeInfoIndex].TargetMode; } DisplayConfigDesktopImageInfo?desktopImageMode = null; if (isVirtualSupported && (displayPath.TargetInfo.DesktopModeInfoIndex != DisplayConfigDesktopImageInfo.InvalidDesktopImageModeIndex) && (displayModes[displayPath.TargetInfo.DesktopModeInfoIndex].InfoType == DisplayConfigModeInfoType.DesktopImage)) { desktopImageMode = displayModes[displayPath.TargetInfo.DesktopModeInfoIndex].DesktopImageInfo; } pathInfos[key].Item3.Add( new Tuple <DisplayConfigPathInfoFlags, DisplayConfigPathTargetInfo, DisplayConfigTargetMode?, DisplayConfigDesktopImageInfo?>( displayPath.Flags, displayPath.TargetInfo, targetMode, desktopImageMode)); } return (pathInfos.Select(pair => new PathInfo(pair.Value.Item1, pair.Value.Item2, pair.Value.Item3)).ToArray()); }