Exemple #1
0
        ///// <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);
            }
        }