///// <summary></summary> ///// <param name="identifier"></param> ///// <returns></returns> //public static DisplayAdapter GetAdapter( DisplayDeviceId identifier ) //{ // foreach( var adapter in adaptersByDeviceName.Values ) // { // if( adapter.Identifier.Equals( identifier ) ) // return adapter; // } // return null; //} #endregion Display adapters #region Display monitors ///// <summary></summary> ///// <param name="identifier"></param> ///// <returns></returns> //public static DisplayMonitor GetMonitor( DisplayDeviceId identifier ) //{ // foreach( var adapter in adaptersByDeviceName.Values ) // { // foreach( var monitor in adapter.Monitors ) // { // if( monitor.identifier.Equals( identifier ) ) // return monitor; // } // } // return null; //} /// <summary>Returns a monitor given its handle (HMONITOR).</summary> /// <param name="monitorHandle">The monitor handle.</param> /// <returns>Returns the monitor associated with the specified handle, or null.</returns> public static DisplayMonitor GetMonitorByHandle(IntPtr monitorHandle) { if (!isInitialized) { Update(); } var monitorInfo = DisplayMonitor.GetInfo(monitorHandle); if (adaptersByDeviceName.TryGetValue(monitorInfo.AdapterDeviceName, out DisplayAdapter adapter)) { return(adapter.GetMonitorByHandle(monitorHandle)); } return(null); }
private void RefreshMonitorList() { var deviceName = base.DeviceName; var allHandles = GetMonitorHandles(); var handles = new List <IntPtr>(); var hMax = allHandles.Count; int h; for (h = 0; h < hMax; ++h) { var info = DisplayMonitor.GetInfo(allHandles[h]); if (deviceName.Equals(info.AdapterDeviceName, StringComparison.Ordinal)) { handles.Add(allHandles[h]); } } var removedMonitors = new List <string>(monitorsByDeviceName.Keys); var addedMonitors = new List <DisplayMonitor>(); var primaryMonitorChanged = false; var monitors = EnumDisplayDevices(deviceName, true); DisplayMonitor displayMonitor; h = 0; for (var m = 0; m < monitors.Count; ++m) { var monitor = monitors[m]; var handle = IntPtr.Zero; if ((monitor.State & (int)DisplayMonitorStateIndicators.Active) != 0 && (h < handles.Count)) { handle = handles[h]; // FIXME - this is not the right handle when topology is Clone ! ++h; } if (monitorsByDeviceName.TryGetValue(monitor.DeviceName, out displayMonitor)) { displayMonitor.Refresh(ref monitor); displayMonitor.Handle = handle; removedMonitors.Remove(monitor.DeviceName); } else { displayMonitor = new DisplayMonitor(this, monitor, handle); monitorsByDeviceName.Add(monitor.DeviceName, displayMonitor); addedMonitors.Add(displayMonitor); } if (displayMonitor.IsPrimary && (primaryDisplayMonitor != displayMonitor)) { primaryMonitorChanged = (primaryDisplayMonitor != null); primaryDisplayMonitor = displayMonitor; } } while (addedMonitors.Count > 0) { this.OnMonitorConnectedOrDisconnected(addedMonitors[0], true); addedMonitors.RemoveAt(0); } while (removedMonitors.Count > 0) { deviceName = removedMonitors[0]; removedMonitors.RemoveAt(0); displayMonitor = monitorsByDeviceName[deviceName]; monitorsByDeviceName.Remove(deviceName); displayMonitor.OnDisconnected(); this.OnMonitorConnectedOrDisconnected(displayMonitor, false); } if (primaryMonitorChanged) { PrimaryMonitorChanged?.Invoke(this, EventArgs.Empty); } }