private static List <QueryMonitorInfo> GetQueryDisplayMonitorInfo()
        {
            List <QueryMonitorInfo> monitors = new List <QueryMonitorInfo>();
            int error = GetDisplayConfigBufferSizes(QUERY_DEVICE_CONFIG_FLAGS.QDC_ONLY_ACTIVE_PATHS,
                                                    out uint pathCount, out uint modeCount);

            if (error != ERROR_SUCCESS)
            {
                throw new Win32Exception(error);
            }

            DISPLAYCONFIG_PATH_INFO[] displayPaths = new DISPLAYCONFIG_PATH_INFO[pathCount];
            DISPLAYCONFIG_MODE_INFO[] displayModes = new DISPLAYCONFIG_MODE_INFO[modeCount];
            error = QueryDisplayConfig(QUERY_DEVICE_CONFIG_FLAGS.QDC_ONLY_ACTIVE_PATHS,
                                       ref pathCount, displayPaths, ref modeCount, displayModes, IntPtr.Zero);
            if (error != ERROR_SUCCESS)
            {
                throw new Win32Exception(error);
            }

            Logger.Instance.LogMessage(TracingLevel.INFO, $"QueryDisplay returned {pathCount} paths and {modeCount} modes");
            QueryMonitorInfo currMonitor = new QueryMonitorInfo();

            for (int idx = 0; idx < modeCount; idx++)
            {
                if (idx % 2 == 0)
                {
                    currMonitor = new QueryMonitorInfo
                    {
                        AdapterId = displayModes[idx].adapterId,
                        Id        = displayModes[idx].id
                    };
                }
                else
                {
                    if (currMonitor.AdapterId.HighPart != displayModes[idx].adapterId.HighPart || currMonitor.AdapterId.LowPart != displayModes[idx].adapterId.LowPart)
                    {
                        throw new Exception("Inconsistent Adapter Id");
                    }
                }
                if (displayModes[idx].infoType == DISPLAYCONFIG_MODE_INFO_TYPE.DISPLAYCONFIG_MODE_INFO_TYPE_TARGET)
                {
                    currMonitor.UserFriendlyName = MonitorFriendlyName(displayModes[idx].adapterId, displayModes[idx].id);
                    currMonitor.DevicePath       = MonitorDevicePath(displayModes[idx].adapterId, displayModes[idx].id);
                }
                else if (displayModes[idx].infoType == DISPLAYCONFIG_MODE_INFO_TYPE.DISPLAYCONFIG_MODE_INFO_TYPE_SOURCE)
                {
                    currMonitor.DisplayName = GDI(displayModes[idx].adapterId, displayModes[idx].id);
                }

                if (idx % 2 != 0)
                {
                    monitors.Add(currMonitor);
                }
            }
            Logger.Instance.LogMessage(TracingLevel.INFO, $"QueryDisplay returned {monitors.Count} monitors");
            return(monitors);
        }
Example #2
0
        public MonitorInfo(WMIMonitorInfo wmiInfo, QueryMonitorInfo queryInfo)
        {
            WMIInfo   = wmiInfo;
            QueryInfo = queryInfo;

            if (WMIInfo != null && QueryInfo != null)
            {
                UniqueValue  = $"{WMIInfo?.UserFriendlyName}{Constants.UNIQUE_VALUE_DELIMITER}{WMIInfo?.SerialNumber}{Constants.UNIQUE_VALUE_DELIMITER}{WMIInfo.InstanceName}";
                DeviceName   = QueryInfo?.DisplayName;
                FriendlyName = WMIInfo?.UserFriendlyName;
                DisplayName  = FriendlyName;
            }
        }