コード例 #1
0
 public bool UpdateBrightness(int brightness = -1)
 {
     lock (_lock)
     {
         this.Brightness = MonitorConfiguration.GetBrightness(Handle);
         return(0 <= this.Brightness);
     }
 }
コード例 #2
0
 public override bool UpdateBrightness(int brightness = -1)
 {
     lock (_lock)
     {
         this.Brightness = MonitorConfiguration.GetBrightness(_handle, _useLowLevel);
         return(0 <= this.Brightness);
     }
 }
コード例 #3
0
ファイル: MonitorManager.cs プロジェクト: Raytar/Monitorian
            public MonitorData()
            {
                DeviceItems = DeviceContext.EnumerateMonitorDevices().ToArray();

                PhysicalItems = DeviceContext.GetMonitorHandles().ToDictionary(
                    x => x,
                    x => MonitorConfiguration.EnumeratePhysicalMonitors(x.MonitorHandle).ToArray());

                InstalledItems = DeviceInstallation.EnumerateInstalledMonitors().ToArray();
                DesktopItems   = MSMonitor.EnumerateDesktopMonitors().ToArray();
            }
コード例 #4
0
        public override bool SetBrightness(int brightness)
        {
            if ((brightness < 0) || (100 < brightness))
            {
                throw new ArgumentOutOfRangeException(nameof(brightness), "The brightness must be within 0 to 100.");
            }

            lock (_lock)
            {
                if (MonitorConfiguration.SetBrightness(_handle, brightness, _useLowLevel))
                {
                    this.Brightness = brightness;
                    return(true);
                }
                return(false);
            }
        }
コード例 #5
0
        private uint _maximum = 100;       // Raw maximum brightness (not always 100)

        public override bool UpdateBrightness(int brightness = -1)
        {
            lock (_lock)
            {
                var(success, minimum, current, maximum) = MonitorConfiguration.GetBrightness(_handle, _useLowLevel);

                if (!success || !(minimum < maximum) || !(minimum <= current) || !(current <= maximum))
                {
                    this.Brightness = -1;
                    return(false);
                }
                this.Brightness = (int)Math.Round((double)(current - minimum) / (maximum - minimum) * 100D, MidpointRounding.AwayFromZero);
                this._minimum   = minimum;
                this._maximum   = maximum;
                return(true);
            }
        }
コード例 #6
0
            public async Task PopulateAsync()
            {
                var sw = new Stopwatch();

                var actions = new[]
                {
                    GetAction(nameof(DeviceItems), () =>
                              DeviceItems = DeviceContext.EnumerateMonitorDevices().ToArray()),

                    GetAction(nameof(PhysicalItems), () =>
                              PhysicalItems = DeviceContext.GetMonitorHandles().ToDictionary(
                                  x => x,
                                  x => MonitorConfiguration.EnumeratePhysicalMonitors(x.MonitorHandle, true).ToArray())),

                    GetAction(nameof(InstalledItems), () =>
                              InstalledItems = DeviceInstallation.EnumerateInstalledMonitors().ToArray()),

                    GetAction(nameof(DesktopItems), () =>
                              DesktopItems = MSMonitor.EnumerateDesktopMonitors().ToArray()),

                    GetAction(nameof(DisplayItems), async() =>
                    {
                        if (OsVersion.Is10Redstone4OrNewer)
                        {
                            DisplayItems = await DisplayInformation.GetDisplayMonitorsAsync();
                        }
                    })
                };

                ElapsedTime = new string[actions.Length];

                sw.Start();

                await Task.WhenAll(actions.Select((x, index) => Task.Run(() => x.Invoke(index))));

                sw.Stop();

                Action <int> GetAction(string name, Action action) =>
                new Action <int>((index) =>
                {
                    action.Invoke();
                    ElapsedTime[index] = $"{name} -> {sw.ElapsedMilliseconds}";
                });
            }
コード例 #7
0
        public override bool SetBrightness(int brightness)
        {
            if ((brightness < 0) || (100 < brightness))
            {
                throw new ArgumentOutOfRangeException(nameof(brightness), "The brightness must be within 0 to 100.");
            }

            lock (_lock)
            {
                var buffer = (uint)Math.Round(brightness / 100D * (_maximum - _minimum) + _minimum, MidpointRounding.AwayFromZero);

                if (MonitorConfiguration.SetBrightness(_handle, buffer, _useLowLevel))
                {
                    this.Brightness = brightness;
                    return(true);
                }
                return(false);
            }
        }
コード例 #8
0
        public override bool IsInvalid => false;         // The validity cannot be checked by the handle.

        protected override bool ReleaseHandle()
        {
            return(MonitorConfiguration.DestroyPhysicalMonitor(handle));
        }
コード例 #9
0
ファイル: MonitorManager.cs プロジェクト: Raytar/Monitorian
        public static IEnumerable <IMonitor> EnumerateMonitors()
        {
            var deviceItems = DeviceContext.EnumerateMonitorDevices().ToList();

            if (deviceItems.Count == 0)
            {
                yield break;
            }

            // By DDC/CI
            foreach (var handleItem in DeviceContext.GetMonitorHandles())
            {
                foreach (var physicalItem in MonitorConfiguration.EnumeratePhysicalMonitors(handleItem.MonitorHandle))
                {
                    int index = -1;
                    if (physicalItem.IsBrightnessSupported)
                    {
                        index = deviceItems.FindIndex(x =>
                                                      (x.DisplayIndex == handleItem.DisplayIndex) &&
                                                      (x.MonitorIndex == physicalItem.MonitorIndex) &&
                                                      string.Equals(x.Description, physicalItem.Description, StringComparison.OrdinalIgnoreCase));
                    }
                    if (index < 0)
                    {
                        physicalItem.Handle.Dispose();
                        continue;
                    }

                    var deviceItem = deviceItems[index];
                    yield return(new DdcMonitorItem(
                                     deviceInstanceId: deviceItem.DeviceInstanceId,
                                     description: deviceItem.FriendlyName,
                                     displayIndex: deviceItem.DisplayIndex,
                                     monitorIndex: deviceItem.MonitorIndex,
                                     handle: physicalItem.Handle,
                                     isLowLevel: physicalItem.IsLowLevel));

                    deviceItems.RemoveAt(index);
                    if (deviceItems.Count == 0)
                    {
                        yield break;
                    }
                }
            }

            // By WMI
            var installedItems = DeviceInstallation.EnumerateInstalledMonitors().ToArray();

            foreach (var desktopItem in MSMonitor.EnumerateDesktopMonitors())
            {
                foreach (var installedItem in installedItems)
                {
                    int index = -1;
                    if (desktopItem.BrightnessLevels.Any())
                    {
                        index = deviceItems.FindIndex(x =>
                                                      string.Equals(x.DeviceInstanceId, desktopItem.DeviceInstanceId, StringComparison.OrdinalIgnoreCase) &&
                                                      string.Equals(x.DeviceInstanceId, installedItem.DeviceInstanceId, StringComparison.OrdinalIgnoreCase));
                    }
                    if (index < 0)
                    {
                        continue;
                    }

                    var deviceItem = deviceItems[index];
                    yield return(new WmiMonitorItem(
                                     deviceInstanceId: deviceItem.DeviceInstanceId,
                                     description: deviceItem.FriendlyName,
                                     displayIndex: deviceItem.DisplayIndex,
                                     monitorIndex: deviceItem.MonitorIndex,
                                     brightnessLevels: desktopItem.BrightnessLevels,
                                     isRemovable: installedItem.IsRemovable));

                    deviceItems.RemoveAt(index);
                    if (deviceItems.Count == 0)
                    {
                        yield break;
                    }
                }
            }

            // Rest
            foreach (var deviceItem in deviceItems)
            {
                yield return(new InaccessibleMonitorItem(
                                 deviceInstanceId: deviceItem.DeviceInstanceId,
                                 description: deviceItem.FriendlyName,
                                 displayIndex: deviceItem.DisplayIndex,
                                 monitorIndex: deviceItem.MonitorIndex));
            }
        }
コード例 #10
0
        public static IEnumerable <IMonitor> EnumerateMonitors()
        {
            var deviceItems = DeviceContext.EnumerateMonitorDevices().ToList();

            if (deviceItems.Count == 0)
            {
                yield break;
            }

            // By DDC/CI
            foreach (var handleItem in DeviceContext.GetMonitorHandles())
            {
                foreach (var physicalItem in MonitorConfiguration.EnumeratePhysicalMonitors(handleItem.MonitorHandle))
                {
                    //Debug.WriteLine($"Display: {handleItem.DisplayIndex}, Monitor: {physicalItem.MonitorIndex}");

                    var index = deviceItems.FindIndex(x =>
                                                      (x.DisplayIndex == handleItem.DisplayIndex) &&
                                                      (x.MonitorIndex == physicalItem.MonitorIndex) &&
                                                      string.Equals(x.Description, physicalItem.Description, StringComparison.OrdinalIgnoreCase));
                    if (0 <= index)
                    {
                        yield return(new DdcMonitorItem(
                                         description: deviceItems[index].Description,
                                         deviceInstanceId: deviceItems[index].DeviceInstanceId,
                                         displayIndex: deviceItems[index].DisplayIndex,
                                         monitorIndex: deviceItems[index].MonitorIndex,
                                         handle: physicalItem.Handle));

                        deviceItems.RemoveAt(index);
                        if (deviceItems.Count == 0)
                        {
                            yield break;
                        }
                        else
                        {
                            continue;
                        }
                    }
                    physicalItem.Handle.Dispose();
                }
            }

            // By WMI
            var installedItems = DeviceInstallation.EnumerateInstalledMonitors().ToArray();

            foreach (var desktopItem in MSMonitor.EnumerateDesktopMonitors())
            {
                foreach (var installedItem in installedItems)
                {
                    var index = deviceItems.FindIndex(x =>
                                                      string.Equals(x.DeviceInstanceId, desktopItem.DeviceInstanceId, StringComparison.OrdinalIgnoreCase) &&
                                                      string.Equals(x.DeviceInstanceId, installedItem.DeviceInstanceId, StringComparison.OrdinalIgnoreCase));
                    if (0 <= index)
                    {
                        yield return(new WmiMonitorItem(
                                         description: deviceItems[index].Description,
                                         deviceInstanceId: deviceItems[index].DeviceInstanceId,
                                         displayIndex: deviceItems[index].DisplayIndex,
                                         monitorIndex: deviceItems[index].MonitorIndex,
                                         brightnessLevels: desktopItem.BrightnessLevels,
                                         isRemovable: installedItem.IsRemovable));

                        deviceItems.RemoveAt(index);
                        if (deviceItems.Count == 0)
                        {
                            yield break;
                        }
                    }
                }
            }
        }