Example #1
0
 private static extern ErrorCode QueryDisplayConfig(
     QueryDisplayConfigFlags flags,
     ref int numPathArrayElements,
     [Out] DisplayConfigPathInfo[] pathArray,
     ref int numModeInfoArrayElements,
     [Out] DisplayConfigModeInfo[] modeInfoArray,
     ref DisplayConfigTopologyId currentTopologyId);
Example #2
0
 public static extern StatusCode QueryDisplayConfig(
     QueryDisplayFlags flags,
     ref int numPathArrayElements,
     [Out] DisplayConfigPathInfo[] pathInfoArray,
     ref int modeInfoArrayElements,
     [Out] DisplayConfigModeInfo[] modeInfoArray,
     out DisplayConfigTopologyId topologyId
     );
Example #3
0
 public static extern User32Status QueryDisplayConfig(
     QueryDeviceConfigFlags flags,
     ref uint pathArrayElements,
     [Out] DisplayConfigPathInfo[] pathInfoArray,
     ref uint modeInfoArrayElements,
     [Out] DisplayConfigModeInfo[] modeInfoArray,
     [Out] out DisplayConfigTopologyId currentTopologyId
     );
Example #4
0
        /// <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);
        }
Example #5
0
        /// <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));
            }
        }
Example #6
0
        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);
        }
Example #8
0
        /// <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);
        }
Example #9
0
 public static extern int QueryDisplayConfig(QueryDisplayFlags flags, out uint numPathArrayElements, [Out] DisplayConfigPathInfo[] pathInfoArray, out uint modeInfoArrayElements, [Out] DisplayConfigModeInfo[] modeInfoArray, out DisplayConfigTopologyId id);
Example #10
0
        /// <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;
        }
Example #11
0
 public static extern int QueryDisplayConfig( QueryDisplayFlags flags, out uint numPathArrayElements, [Out] DisplayConfigPathInfo[] pathInfoArray, out uint modeInfoArrayElements, [Out] DisplayConfigModeInfo[] modeInfoArray, out DisplayConfigTopologyId id );
Example #12
0
 QueryDisplayConfig(
     QueryDisplayConfigFlags flags,
     DisplayConfigTopologyId currentTopologyId)
 {
     return(QueryDisplayConfig(flags, ref currentTopologyId));
 }
Example #13
0
        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());
        }
Example #14
0
        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);
        }