Beispiel #1
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());
        }