private static extern ErrorCode QueryDisplayConfig( QueryDisplayConfigFlags flags, ref int numPathArrayElements, [Out] DisplayConfigPathInfo[] pathArray, ref int numModeInfoArrayElements, [Out] DisplayConfigModeInfo[] modeInfoArray, ref DisplayConfigTopologyId currentTopologyId);
public static extern StatusCode QueryDisplayConfig( QueryDisplayFlags flags, ref int numPathArrayElements, [Out] DisplayConfigPathInfo[] pathInfoArray, ref int modeInfoArrayElements, [Out] DisplayConfigModeInfo[] modeInfoArray, out DisplayConfigTopologyId topologyId );
public static extern User32Status QueryDisplayConfig( QueryDeviceConfigFlags flags, ref uint pathArrayElements, [Out] DisplayConfigPathInfo[] pathInfoArray, ref uint modeInfoArrayElements, [Out] DisplayConfigModeInfo[] modeInfoArray, [Out] out DisplayConfigTopologyId currentTopologyId );
/// <summary> /// Validates a topology before applying /// </summary> /// <param name="topology">The topology identification</param> /// <returns>true if topology is applicable, otherwise false</returns> /// <exception cref="ArgumentOutOfRangeException"></exception> public static bool ValidateTopology(DisplayConfigTopologyId topology) { if (topology == DisplayConfigTopologyId.None) { throw new ArgumentOutOfRangeException(nameof(topology), "Topology should not be empty."); } var flags = (SetDisplayConfigFlags)topology; return(DisplayConfigApi.SetDisplayConfig(0, null, 0, null, SetDisplayConfigFlags.Validate | flags) == Win32Status.Success); }
/// <summary> /// Applies a saved topology /// </summary> /// <param name="topology">The topology identification to apply</param> /// <param name="allowPersistence">true to allows persistence of the changes, otherwise false</param> /// <exception cref="PathChangeException">Error in changing paths</exception> public static void ApplyTopology(DisplayConfigTopologyId topology, bool allowPersistence = false) { if (!ValidateTopology(topology)) { throw new PathChangeException("Invalid topology request."); } var flags = (SetDisplayConfigFlags)topology; if (allowPersistence) { flags |= SetDisplayConfigFlags.PathPersistIfRequired; } var result = DisplayConfigApi.SetDisplayConfig(0, null, 0, null, SetDisplayConfigFlags.Apply | flags); if (result != Win32Status.Success) { throw new PathChangeException("An error occurred while applying the requested topology.", new Win32Exception((int)result)); } }
QueryDisplayConfig( QueryDisplayConfigFlags flags, ref DisplayConfigTopologyId currentTopologyIdRef) { int numPaths = MaxArrayLength; int numModes = MaxArrayLength; var paths = new DisplayConfigPathInfo[numPaths]; var modes = new DisplayConfigModeInfo[numModes]; ErrorCode result = QueryDisplayConfig( flags, ref numPaths, paths, ref numModes, modes, ref currentTopologyIdRef); result.ThrowIfError(); Array.Resize(ref paths, numPaths); Array.Resize(ref modes, numModes); return(new DisplayConfigInfo(paths, modes)); }
public static DisplayConfigTopologyId GetCurrentMode(QueryDisplayFlags pathType = QueryDisplayFlags.DatabaseCurrent) { DisplayConfigTopologyId topologyId = DisplayConfigTopologyId.Zero; int numPathArrayElements; int numModeInfoArrayElements; var status = CCDWrapper.GetDisplayConfigBufferSizes( pathType, out numPathArrayElements, out numModeInfoArrayElements); if (status != StatusCode.Success) { // TODO; POSSIBLY HANDLE SOME OF THE CASES. var reason = string.Format("GetDisplayConfigBufferSizesFailed() failed. Status: {0}", status); throw new Exception(reason); } var pathInfoArray = new DisplayConfigPathInfo[numPathArrayElements]; var modeInfoArray = new DisplayConfigModeInfo[numModeInfoArrayElements]; var queryDisplayStatus = pathType == QueryDisplayFlags.DatabaseCurrent ? CCDWrapper.QueryDisplayConfig( pathType, ref numPathArrayElements, pathInfoArray, ref numModeInfoArrayElements, modeInfoArray, out topologyId) : CCDWrapper.QueryDisplayConfig( pathType, ref numPathArrayElements, pathInfoArray, ref numModeInfoArrayElements, modeInfoArray); if (queryDisplayStatus != StatusCode.Success) { // TODO; POSSIBLY HANDLE SOME OF THE CASES. var reason = string.Format("QueryDisplayConfig() failed. Status: {0}", queryDisplayStatus); throw new Exception(reason); } return(topologyId); }
/// <summary> /// This method can be used in order to filter out specific paths that we are interested, /// a long with their corresponding paths. /// </summary> /// <param name="pathType"></param> /// <param name="topologyId"></param> /// <returns></returns> public static IEnumerable <DisplayConfigPathWrap> GetPathWraps( QueryDisplayFlags pathType, out DisplayConfigTopologyId topologyId) { topologyId = DisplayConfigTopologyId.Zero; int numPathArrayElements; int numModeInfoArrayElements; var status = Wrapper.GetDisplayConfigBufferSizes( pathType, out numPathArrayElements, out numModeInfoArrayElements); if (status != StatusCode.Success) { // TODO; POSSIBLY HANDLE SOME OF THE CASES. var reason = string.Format("GetDisplayConfigBufferSizesFailed() failed. Status: {0}", status); throw new Exception(reason); } var pathInfoArray = new DisplayConfigPathInfo[numPathArrayElements]; var modeInfoArray = new DisplayConfigModeInfo[numModeInfoArrayElements]; // topology ID only valid with QDC_DATABASE_CURRENT var queryDisplayStatus = pathType == QueryDisplayFlags.DatabaseCurrent ? Wrapper.QueryDisplayConfig( pathType, ref numPathArrayElements, pathInfoArray, ref numModeInfoArrayElements, modeInfoArray, out topologyId) : Wrapper.QueryDisplayConfig( pathType, ref numPathArrayElements, pathInfoArray, ref numModeInfoArrayElements, modeInfoArray); ////////////////////// if (queryDisplayStatus != StatusCode.Success) { // TODO; POSSIBLY HANDLE SOME OF THE CASES. var reason = string.Format("QueryDisplayConfig() failed. Status: {0}", queryDisplayStatus); throw new Exception(reason); } var list = new List <DisplayConfigPathWrap>(); foreach (var path in pathInfoArray) { var outputModes = new List <DisplayConfigModeInfo>(); foreach (var modeIndex in new[] { path.sourceInfo.modeInfoIdx, path.targetInfo.modeInfoIdx }) { if (modeIndex < modeInfoArray.Length) { outputModes.Add(modeInfoArray[modeIndex]); } } list.Add(new DisplayConfigPathWrap(path, outputModes)); } return(list); }
public static extern int QueryDisplayConfig(QueryDisplayFlags flags, out uint numPathArrayElements, [Out] DisplayConfigPathInfo[] pathInfoArray, out uint modeInfoArrayElements, [Out] DisplayConfigModeInfo[] modeInfoArray, out DisplayConfigTopologyId id);
/// <summary> /// This method can be used in order to filter out specific paths that we are interested, /// a long with their corresponding paths. /// </summary> /// <param name="pathType"></param> /// <param name="topologyId"></param> /// <returns></returns> public static IEnumerable<DisplayConfigPathWrap> GetPathWraps( QueryDisplayFlags pathType, out DisplayConfigTopologyId topologyId) { topologyId = DisplayConfigTopologyId.Zero; int numPathArrayElements; int numModeInfoArrayElements; var status = Wrapper.GetDisplayConfigBufferSizes( pathType, out numPathArrayElements, out numModeInfoArrayElements); if (status != StatusCode.Success) { // TODO; POSSIBLY HANDLE SOME OF THE CASES. var reason = string.Format("GetDisplayConfigBufferSizesFailed() failed. Status: {0}", status); throw new Exception(reason); } var pathInfoArray = new DisplayConfigPathInfo[numPathArrayElements]; var modeInfoArray = new DisplayConfigModeInfo[numModeInfoArrayElements]; // topology ID only valid with QDC_DATABASE_CURRENT var queryDisplayStatus = pathType == QueryDisplayFlags.DatabaseCurrent ? Wrapper.QueryDisplayConfig( pathType, ref numPathArrayElements, pathInfoArray, ref numModeInfoArrayElements, modeInfoArray, out topologyId) : Wrapper.QueryDisplayConfig( pathType, ref numPathArrayElements, pathInfoArray, ref numModeInfoArrayElements, modeInfoArray); ////////////////////// if (queryDisplayStatus != StatusCode.Success) { // TODO; POSSIBLY HANDLE SOME OF THE CASES. var reason = string.Format("QueryDisplayConfig() failed. Status: {0}", queryDisplayStatus); throw new Exception(reason); } var list = new List<DisplayConfigPathWrap>(); foreach (var path in pathInfoArray) { var outputModes = new List<DisplayConfigModeInfo>(); foreach (var modeIndex in new[] { path.sourceInfo.modeInfoIdx, path.targetInfo.modeInfoIdx }) { if (modeIndex < modeInfoArray.Length) outputModes.Add(modeInfoArray[modeIndex]); } list.Add(new DisplayConfigPathWrap(path, outputModes)); } return list; }
public static extern int QueryDisplayConfig( QueryDisplayFlags flags, out uint numPathArrayElements, [Out] DisplayConfigPathInfo[] pathInfoArray, out uint modeInfoArrayElements, [Out] DisplayConfigModeInfo[] modeInfoArray, out DisplayConfigTopologyId id );
QueryDisplayConfig( QueryDisplayConfigFlags flags, DisplayConfigTopologyId currentTopologyId) { return(QueryDisplayConfig(flags, ref currentTopologyId)); }
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()); }
private IEnumerable <DisplayConfigPathWrap> QueryDisplay(QueryDisplayFlags pathType, out DisplayConfigTopologyId topologyId) { topologyId = DisplayConfigTopologyId.Zero; var status = Win32Api.GetDisplayConfigBufferSizes( pathType, out int numPathArrayElements, out int numModeInfoArrayElements); if (status != StatusCode.Success) { var reason = string.Format("GetDisplayConfigBufferSizesFailed() failed. Status: {0}", status); throw new InvalidOperationException(reason); } var pathInfoArray = new DisplayConfigPathInfo[numPathArrayElements]; var modeInfoArray = new DisplayConfigModeInfo[numModeInfoArrayElements]; var queryDisplayStatus = pathType == QueryDisplayFlags.DatabaseCurrent ? Win32Api.QueryDisplayConfig(pathType, ref numPathArrayElements, pathInfoArray, ref numModeInfoArrayElements, modeInfoArray, out topologyId) : Win32Api.QueryDisplayConfig(pathType, ref numPathArrayElements, pathInfoArray, ref numModeInfoArrayElements, modeInfoArray); if (queryDisplayStatus != StatusCode.Success) { var reason = string.Format("QueryDisplayConfig() failed. Status: {0}", queryDisplayStatus); throw new InvalidOperationException(reason); } var list = new List <DisplayConfigPathWrap>(); foreach (var path in pathInfoArray) { var outputModes = new List <DisplayConfigModeInfo>(); foreach (var modeIndex in new[] { path.sourceInfo.modeInfoIdx, path.targetInfo.modeInfoIdx }) { if (modeIndex >= 0 && modeIndex < modeInfoArray.Length) { outputModes.Add(modeInfoArray[modeIndex]); } } list.Add(new DisplayConfigPathWrap(path, outputModes)); } return(list); }