コード例 #1
0
            private void TestBrightness()
            {
                var(isGetSuccess, minimum, current, maximum) = MonitorConfiguration.GetBrightness(Handle, IsLowLevelSupported);
                var isValid = (minimum < maximum) && (minimum <= current) && (current <= maximum);

                GetBrightness = $"Success: {isGetSuccess}" + (isGetSuccess ? $", Valid: {isValid} (Minimum: {minimum}, Current: {current}, Maximum: {maximum})" : string.Empty);

                var difference = (uint)(DateTime.Now.Ticks % 6 + 5);                 // Integer from 5 to 10
                var expected   = difference;

                if (isGetSuccess && isValid)
                {
                    expected = (current - minimum > maximum - current) ? current - difference : current + difference;
                    expected = Math.Min(maximum, Math.Max(minimum, expected));
                }

                var isSetSuccess = MonitorConfiguration.SetBrightness(Handle, expected, IsLowLevelSupported);

                var(_, _, actual, _) = MonitorConfiguration.GetBrightness(Handle, IsLowLevelSupported);
                SetBrightness        = $"Success: {isSetSuccess}" + (isSetSuccess ? $", Match: {expected == actual} (Expected: {expected}, Actual: {actual})" : string.Empty);

                if (isSetSuccess)
                {
                    MonitorConfiguration.SetBrightness(Handle, current, IsLowLevelSupported);
                }
            }
コード例 #2
0
            private void TestBrightness()
            {
                var(success, _, current, maximum) = MonitorConfiguration.GetBrightness(Handle, IsLowLevelSupported);
                GetBrightness = success;

                SetBrightness = MonitorConfiguration.SetBrightness(Handle, Math.Min(maximum, current + 5), IsLowLevelSupported);
                if (SetBrightness)
                {
                    MonitorConfiguration.SetBrightness(Handle, current, IsLowLevelSupported);
                }
            }
コード例 #3
0
ファイル: DdcMonitorItem.cs プロジェクト: usaone/Monitorian
        private uint _maximum = 100;       // Raw maximum brightness (not always 100)

        public override bool UpdateBrightness(int brightness = -1)
        {
            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);
        }
コード例 #4
0
            public async Task PopulateAsync()
            {
                System = GetSystem();

                var sw = new Stopwatch();

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

                    GetTask(nameof(DisplayMonitorItems), async() =>
                    {
                        if (OsVersion.Is10Redstone4OrNewer)
                        {
                            DisplayMonitorItems = await DisplayMonitor.GetDisplayMonitorsAsync();
                        }
                    }),

                    GetTask(nameof(DisplayConfigItems), () =>
                            DisplayConfigItems = DisplayConfig.EnumerateDisplayConfigs().ToArray()),

                    GetTask(nameof(InstalledItems), () =>
                            InstalledItems = DeviceInformation.EnumerateInstalledMonitors().ToArray()),

                    GetTask(nameof(PhysicalItems), () =>
                            PhysicalItems = DeviceContext.GetMonitorHandles().ToDictionary(
                                x => x,
                                x => MonitorConfiguration.EnumeratePhysicalMonitors(x.MonitorHandle, true)
                                .Select(x => new PhysicalItemPlus(x))
                                .ToArray())),

                    GetTask(nameof(DesktopItems), () =>
                            DesktopItems = MSMonitor.EnumerateDesktopMonitors().ToArray())
                };

                sw.Start();

                ElapsedTime = await Task.WhenAll(tasks);

                sw.Stop();

                Task <string> GetTask(string name, Action action) =>
                Task.Run(() =>
                {
                    action.Invoke();
                    var elapsed = sw.Elapsed;
                    return($@"{name,-14} -> {elapsed.ToString($@"{(elapsed.Minutes > 0 ? @"m\:" : string.Empty)}s\.fff")}");
                });
            }
コード例 #5
0
ファイル: DdcMonitorItem.cs プロジェクト: usaone/Monitorian
        public override bool SetBrightness(int brightness)
        {
            if ((brightness < 0) || (100 < brightness))
            {
                throw new ArgumentOutOfRangeException(nameof(brightness), brightness, "The brightness must be within 0 to 100.");
            }

            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);
        }
コード例 #6
0
        private uint _maximumContrast = 100;       // Raw maximum contrast (not always 100)

        public override AccessResult UpdateContrast()
        {
            var(result, minimum, current, maximum) = MonitorConfiguration.GetContrast(_handle);

            if ((result.Status == AccessStatus.Succeeded) && (minimum < maximum) && (minimum <= current) && (current <= maximum))
            {
                this.Contrast         = (int)Math.Round((double)(current - minimum) / (maximum - minimum) * 100D, MidpointRounding.AwayFromZero);
                this._minimumContrast = minimum;
                this._maximumContrast = maximum;
            }
            else
            {
                this.Contrast = -1;                 // Default
            }
            return(result);
        }
コード例 #7
0
        private uint _maximumBrightness = 100;       // Raw maximum brightness (not always 100)

        public override AccessResult UpdateBrightness(int brightness = -1)
        {
            var(result, minimum, current, maximum) = MonitorConfiguration.GetBrightness(_handle, _capability.IsHighLevelBrightnessSupported);

            if ((result.Status == AccessStatus.Succeeded) && (minimum < maximum) && (minimum <= current) && (current <= maximum))
            {
                this.Brightness         = (int)Math.Round((double)(current - minimum) / (maximum - minimum) * 100D, MidpointRounding.AwayFromZero);
                this._minimumBrightness = minimum;
                this._maximumBrightness = maximum;
            }
            else
            {
                this.Brightness = -1;                 // Default
            }
            return(result);
        }
コード例 #8
0
        private uint _maximum = 100;       // Raw maximum brightness (not always 100)

        public override AccessResult UpdateBrightness(int brightness = -1)
        {
            var(result, minimum, current, maximum) = MonitorConfiguration.GetBrightness(_handle, _useLowLevel);

            if ((result == AccessResult.Succeeded) && (minimum < maximum) && (minimum <= current) && (current <= maximum))
            {
                this.Brightness = (int)Math.Round((double)(current - minimum) / (maximum - minimum) * 100D, MidpointRounding.AwayFromZero);
                this._minimum   = minimum;
                this._maximum   = maximum;
            }
            else
            {
                this.Brightness = -1;
            }
            return(result);
        }
コード例 #9
0
        public override AccessResult SetContrast(int contrast)
        {
            if (contrast is < 0 or > 100)
            {
                throw new ArgumentOutOfRangeException(nameof(contrast), contrast, "The contrast must be within 0 to 100.");
            }

            var buffer = (uint)Math.Round(contrast / 100D * (_maximumContrast - _minimumContrast) + _minimumContrast, MidpointRounding.AwayFromZero);

            var result = MonitorConfiguration.SetContrast(_handle, buffer);

            if (result.Status == AccessStatus.Succeeded)
            {
                this.Contrast = contrast;
            }
            return(result);
        }
コード例 #10
0
        public override AccessResult SetBrightness(int brightness)
        {
            if (brightness is < 0 or > 100)
            {
                throw new ArgumentOutOfRangeException(nameof(brightness), brightness, "The brightness must be within 0 to 100.");
            }

            var buffer = (uint)Math.Round(brightness / 100D * (_maximumBrightness - _minimumBrightness) + _minimumBrightness, MidpointRounding.AwayFromZero);

            var result = MonitorConfiguration.SetBrightness(_handle, buffer, _capability.IsHighLevelBrightnessSupported);

            if (result.Status == AccessStatus.Succeeded)
            {
                this.Brightness = brightness;
            }
            return(result);
        }
コード例 #11
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}";
                });
            }
コード例 #12
0
ファイル: DdcMonitorItem.cs プロジェクト: usaone/Monitorian
        public override bool IsInvalid => false;         // The validity cannot be checked by the handle.

        protected override bool ReleaseHandle()
        {
            return(MonitorConfiguration.DestroyPhysicalMonitor(handle));
        }
コード例 #13
0
        private static IEnumerable <IMonitor> EnumerateMonitors(List <DeviceItemPlus> deviceItems)
        {
            if (!(deviceItems?.Any() == true))
            {
                yield break;
            }

            // Obtained by DDC/CI
            foreach (var handleItem in DeviceContext.GetMonitorHandles())
            {
                foreach (var physicalItem in MonitorConfiguration.EnumeratePhysicalMonitors(handleItem.MonitorHandle))
                {
                    int index = -1;
                    if (physicalItem.IsSupported)
                    {
                        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.AlternateDescription,
                                     displayIndex: deviceItem.DisplayIndex,
                                     monitorIndex: deviceItem.MonitorIndex,
                                     handle: physicalItem.Handle,
                                     useLowLevel: physicalItem.IsLowLevelSupported));

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

            // Obtained 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.AlternateDescription,
                                     displayIndex: deviceItem.DisplayIndex,
                                     monitorIndex: deviceItem.MonitorIndex,
                                     brightnessLevels: desktopItem.BrightnessLevels,
                                     isRemovable: installedItem.IsRemovable));

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

            // Unreachable neither by DDC/CI nor by WMI
            foreach (var deviceItem in deviceItems)
            {
                yield return(new UnreachableMonitorItem(
                                 deviceInstanceId: deviceItem.DeviceInstanceId,
                                 description: deviceItem.AlternateDescription,
                                 displayIndex: deviceItem.DisplayIndex,
                                 monitorIndex: deviceItem.MonitorIndex,
                                 isInternal: deviceItem.IsInternal));
            }
        }