using System.Collections.Generic; using System.Linq; using WindowsDisplayAPI.DisplayConfig; using WindowsDisplayAPI.Native; namespace WindowsDisplayAPI { /// /// Represents a Windows Video Controller Display Adapter Device /// public class DisplayAdapter : Device { /// /// Creates a new DisplayAdapter /// /// The device path /// The device name /// The device driver registry key protected DisplayAdapter(string devicePath, string deviceName, string deviceKey) : base(devicePath, deviceName, deviceKey) { } /// /// Returns a list of all display adapters on this machine /// /// An enumerable list of DisplayAdapters public static IEnumerable GetDisplayAdapters() { var device = Native.DeviceContext.Structures.DisplayDevice.Initialize(); var deviceIds = new List(); for (uint i = 0; DeviceContextApi.EnumDisplayDevices(null, i, ref device, 0); i++) { if (!deviceIds.Contains(device.DeviceId)) { deviceIds.Add(device.DeviceId); yield return new DisplayAdapter(device.DeviceId, device.DeviceString, device.DeviceKey); } device = Native.DeviceContext.Structures.DisplayDevice.Initialize(); } } /// /// Returns a list of all display devices connected to this adapter /// /// An enumerable list of DisplayDevices public IEnumerable GetDisplayDevices() { return GetDisplayDevices(null); } /// /// Returns the corresponding PathDisplayAdapter instance /// /// An instance of PathDisplayAdapter, or null public PathDisplayAdapter ToPathDisplayAdapter() { return PathDisplayAdapter.GetAdapters() .FirstOrDefault(adapter => adapter.DevicePath.StartsWith("\\\\?\\" + DevicePath.Replace("\\", "#")) ); } internal IEnumerable GetDisplayDevices(bool? filterByAvailability) { var returned = new Dictionary(); var adapterIndex = -1; while (true) { adapterIndex++; var adapter = Native.DeviceContext.Structures.DisplayDevice.Initialize(); if (!DeviceContextApi.EnumDisplayDevices(null, (uint) adapterIndex, ref adapter, 0)) { break; } if (!DevicePath.Equals(adapter.DeviceId)) { continue; } var displayIndex = -1; while (true) { displayIndex++; var display = Native.DeviceContext.Structures.DisplayDevice.Initialize(); if (!DeviceContextApi.EnumDisplayDevices(adapter.DeviceName, (uint) displayIndex, ref display, 1)) { break; } var displayDevice = DisplayDevice.FromDeviceInformation(this, adapter, display); if (!filterByAvailability.HasValue) { yield return displayDevice; } else if (displayDevice.IsAvailable == filterByAvailability.Value) { if (returned.ContainsKey(display.DeviceId) && returned[display.DeviceId].Equals(display.DeviceKey) ) { continue; } returned.Add(display.DeviceId, display.DeviceKey); yield return displayDevice; } } } } } }