Example #1
0
        private static DisplayInfoArrays GetDisplayConfigPathInfos(QueryDisplayFlags displayFlags)
        {
            var status = Wrapper.GetDisplayConfigBufferSizes(
                displayFlags,
                out var numPathArrayElements,
                out var numModeInfoArrayElements);

            if (status != StatusCode.Success)
            {
                var reason = $"GetDisplayConfigBufferSizesFailed() failed. Status: {status}";
                throw new Exception(reason);
            }

            var pathInfoArray = new DisplayConfigPathInfo[numPathArrayElements];
            var modeInfoArray = new DisplayConfigModeInfo[numModeInfoArrayElements];

            var queryDisplayStatus = Wrapper.QueryDisplayConfig(
                displayFlags,
                ref numPathArrayElements,
                pathInfoArray,
                ref numModeInfoArrayElements, modeInfoArray);

            if (queryDisplayStatus != StatusCode.Success)
            {
                var reason = $"QueryDisplayConfig() failed. Status: {queryDisplayStatus}";
                throw new Exception(reason);
            }

            var infoArrays = new DisplayInfoArrays {
                Paths = pathInfoArray, Modes = modeInfoArray
            };

            return(infoArrays);
        }
Example #2
0
 public static extern int QueryDisplayConfig(
     QueryDisplayFlags flags,
     ref int numPathArrayElements,
     [Out] DisplayConfigPathInfo[] pathInfoArray,
     ref int modeInfoArrayElements,
     [Out] DisplayConfigModeInfo[] modeInfoArray,
     IntPtr z);
Example #3
0
        private void btnRotate_Click(object sender, EventArgs e)
        {
            DisplayConfigRotation displayConfigRotation = (DisplayConfigRotation)Enum.Parse(typeof(DisplayConfigRotation), comRotate.Text);


            int numPathArrayElements;
            int numModeInfoArrayElements;

            const QueryDisplayFlags pathType = QueryDisplayFlags.OnlyActivePaths;

            // query active paths from the current computer.
            // note that 0 is equal to SUCCESS!
            // TODO; HARDCODE MAGIC VALUES AWAY.
            if (CCDWrapper.GetDisplayConfigBufferSizes(pathType, out numPathArrayElements,
                                                       out numModeInfoArrayElements) == 0)
            {
                var pathInfoArray = new DisplayConfigPathInfo[numPathArrayElements];
                var modeInfoArray = new DisplayConfigModeInfo[numModeInfoArrayElements];

                // TODO; FALLBACK MECHANISM THAT HANDLES DIFFERENT VALUES FOR ZERO.
                if (CCDWrapper.QueryDisplayConfig(
                        pathType,
                        ref numPathArrayElements, pathInfoArray,
                        ref numModeInfoArrayElements,
                        modeInfoArray, IntPtr.Zero) == 0)
                {
                    pathInfoArray[0].targetInfo.rotation = displayConfigRotation;
                    CCDWrapper.SetDisplayConfig(numPathArrayElements, pathInfoArray, numModeInfoArrayElements,
                                                modeInfoArray, SdcFlags.Apply | SdcFlags.UseSuppliedDisplayConfig);
                }
            }
        }
Example #4
0
 public static extern StatusCode QueryDisplayConfig(
     QueryDisplayFlags flags,
     ref int numPathArrayElements,
     [Out] DisplayConfigPathInfo[] pathInfoArray,
     ref int modeInfoArrayElements,
     [Out] DisplayConfigModeInfo[] modeInfoArray,
     out DisplayConfigTopologyId topologyId
     );
Example #5
0
 public static extern StatusCode QueryDisplayConfig(
     QueryDisplayFlags flags,
     ref int numPathArrayElements,
     [Out] DisplayConfigPathInfo[] pathInfoArray,
     ref int modeInfoArrayElements,
     [Out] DisplayConfigModeInfo[] modeInfoArray,
     IntPtr topologyId = default(IntPtr)
     );
Example #6
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);
        }
        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);
        }
        public static DisplayConfiguration QueryDisplayConfig(QueryDisplayFlags flags)
        {
            int numPathArrayElements;
            int numModeInfoArrayElements;

            var queryErrorCode = User32.GetDisplayConfigBufferSizes(flags,
                                                                    out numPathArrayElements, out numModeInfoArrayElements);

            if (queryErrorCode == 0)
            {
                var pathInfoArray = new DisplayConfigPathInfo[numPathArrayElements];
                var modeInfoArray = new DisplayConfigModeInfo[numModeInfoArrayElements];

                queryErrorCode = User32.QueryDisplayConfig(flags,
                                                           ref numPathArrayElements, pathInfoArray,
                                                           ref numModeInfoArrayElements, modeInfoArray,
                                                           IntPtr.Zero);

                return(queryErrorCode == 0 ? new DisplayConfiguration(pathInfoArray, modeInfoArray) : null);
            }
            return(null);
        }
Example #9
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 #10
0
 public static extern int QueryDisplayConfig(QueryDisplayFlags flags, out uint numPathArrayElements, [Out] DisplayConfigPathInfo[] pathInfoArray, out uint modeInfoArrayElements, [Out] DisplayConfigModeInfo[] modeInfoArray, out DisplayConfigTopologyId id);
Example #11
0
 public static extern int GetDisplayConfigBufferSizes(QueryDisplayFlags flags, out uint numPathArrayElements, out uint numModeInfoArrayElements);
Example #12
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 #13
0
 public static extern int QueryDisplayConfig( QueryDisplayFlags flags, out uint numPathArrayElements, [Out] DisplayConfigPathInfo[] pathInfoArray, out uint modeInfoArrayElements, [Out] DisplayConfigModeInfo[] modeInfoArray, out DisplayConfigTopologyId id );
Example #14
0
 public static extern int GetDisplayConfigBufferSizes( QueryDisplayFlags flags, out uint numPathArrayElements, out uint numModeInfoArrayElements );
 static bool ShowConfig(QueryDisplayFlags flags) => SafeExecution(() =>
 {
     Console.WriteLine(Manager.QueryDisplayConfig(flags));
 });
        public static Tuple <List <DisplayConfigPathInfo>, List <DisplayConfigModeInfo> > GetDisplayConfig(QueryDisplayFlags flags)
        {
            while (true)
            {
                uint numPathArrayElements, numModeInfoArrayElements;
                var  err = GetDisplayConfigBufferSizes(flags, out numPathArrayElements, out numModeInfoArrayElements);
                if (err != NO_ERROR)
                {
                    throw Marshal.GetExceptionForHR(Win32ErrorToHResult(err));
                }

                var pathArray = new DisplayConfigPathInfo[numPathArrayElements];
                var modeArray = new DisplayConfigModeInfo[numModeInfoArrayElements];
                err = QueryDisplayConfig(flags, ref numPathArrayElements, pathArray, ref numModeInfoArrayElements, modeArray, IntPtr.Zero);
                if (err == ERROR_INSUFICCIENT_BUFFER)
                {
                    continue;
                }
                if (err != NO_ERROR)
                {
                    throw Marshal.GetExceptionForHR(Win32ErrorToHResult(err));
                }
                return(Tuple.Create(pathArray.Take((int)numPathArrayElements).ToList(), modeArray.Take((int)numModeInfoArrayElements).ToList()));
            }
        }