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); }
public static extern int QueryDisplayConfig( QueryDisplayFlags flags, ref int numPathArrayElements, [Out] DisplayConfigPathInfo[] pathInfoArray, ref int modeInfoArrayElements, [Out] DisplayConfigModeInfo[] modeInfoArray, IntPtr z);
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); } } }
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 StatusCode QueryDisplayConfig( QueryDisplayFlags flags, ref int numPathArrayElements, [Out] DisplayConfigPathInfo[] pathInfoArray, ref int modeInfoArrayElements, [Out] DisplayConfigModeInfo[] modeInfoArray, IntPtr topologyId = default(IntPtr) );
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); }
/// <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);
public static extern int GetDisplayConfigBufferSizes(QueryDisplayFlags flags, out uint numPathArrayElements, out uint numModeInfoArrayElements);
/// <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 );
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())); } }