# C# 获取、设置、监听系统亮度

说明

用到WMI查询,引用System.Management,涉及COM,无法裁剪,则可以忽略System.Management,此dll不进行裁剪,配置如下

C#
<ItemGroup>
    <TrimmerRootAssembly Include="System.Management" />
</ItemGroup>

监听类

C#
public class LightWatcher : IDisposable
{
    public event EventHandler<BrightnessChangedEventArgs> BrightnessChanged;

    public class BrightnessChangedEventArgs : EventArgs
    {
        public object newBrightness { get; set; }

        public BrightnessChangedEventArgs(object b)
        {
            this.newBrightness = b;
        }
    }

    private void WmiEventHandler(object sender, EventArrivedEventArgs e)
    {
        if (OperatingSystem.IsWindows())
        {
            if (BrightnessChanged != null)
            {
                BrightnessChanged(this, new BrightnessChangedEventArgs(e.NewEvent.Properties["Brightness"].Value));
            }
        }
    }

    private readonly ManagementEventWatcher _watcher;

    public LightWatcher()
    {
DEBUG || RELEASE
        if (OperatingSystem.IsWindows())
        {
            try
            {
                var scope = @"root\wmi";
                var query = "SELECT * FROM WmiMonitorBrightnessEvent";
                _watcher = new ManagementEventWatcher(scope, query);
                _watcher.EventArrived += new EventArrivedEventHandler(WmiEventHandler);
                _watcher.Start();
            }
            catch (Exception e)
            {
                Console.WriteLine("Exception {0} Trace {1}", e.Message, e.StackTrace);
            }
        }
    }

    public void Dispose()
    {
        if (OperatingSystem.IsWindows())
        {
            if (_watcher != null)
            {
                _watcher.Stop();
            }

            _watcher.Dispose();
        }
    }
}

获取、设置类

C#
public static class LightWmiHelper
{
    public static int GetBrightnessLevel()
    {
        if (OperatingSystem.IsWindows())
        {
            try
            {
                var s = new ManagementScope("root\\WMI");
                var q = new SelectQuery("WmiMonitorBrightness");
                var mos = new ManagementObjectSearcher(s, q);
                var moc = mos.Get();

                foreach (var managementBaseObject in moc)
                {
                    foreach (var o in managementBaseObject.Properties)
                    {
                        if (o.Name == "CurrentBrightness")
                            return Convert.ToInt32(o.Value);
                    }
                }

                moc.Dispose();
                mos.Dispose();
            }
            catch (ManagementException)
            {
            }
            catch (Exception)
            {
            }
        }
        return 0;
    }

    public static void SetBrightnessLevel(int brightnessLevel)
    {
        if (OperatingSystem.IsWindows())
        {
            if (brightnessLevel < 0 ||
            brightnessLevel > 100)
                throw new ArgumentOutOfRangeException("brightnessLevel");

            try
            {
                var s = new ManagementScope("root\\WMI");
                var q = new SelectQuery("WmiMonitorBrightnessMethods");
                var mos = new ManagementObjectSearcher(s, q);
                var moc = mos.Get();

                foreach (var managementBaseObject in moc)
                {
                    var o = (ManagementObject)managementBaseObject;
                    o.InvokeMethod("WmiSetBrightness", new object[]
                    {
                    UInt32.MaxValue,
                    brightnessLevel
                    });
                }

                moc.Dispose();
                mos.Dispose();
            }
            catch (ManagementException)
            {
            }
            catch (Exception)
            {
            }
        }
    }
}