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;
}
}
}
}
}
}