Windows调节亮度的三种方式
1.通过MVVM绑定ViewModel去滑动条去调节亮度的时候,注意调节亮度的时候由于滑动条变化很多每次滑动都变化的话调用接口比较频繁,建议加一个异步队列去执行。 2.如下通过Slider调节亮度,建议在Value绑定的属性变化的时候去调用亮度调节,如下要是在ValueChanged的时候去触发变化就得要控制UI成触发的变化还是监听其他地方触发的变化,避免回环调用。
<Slider
x:Name="BrightnessSlider"
Margin="48,0,24,0"
Maximum="{Binding BrightnessMaximum}"
Minimum="{Binding BrightnessMinimum}"
MouseEnter="Slider_OnMouseEnter"
MouseUp="Slider_OnMouseUp"
Style="{StaticResource StyleSlider}"
Value="{Binding BrightnessValue}">
<i:Interaction.Triggers>
<i:EventTrigger EventName="ValueChanged">
<i:InvokeCommandAction Command="{Binding BrightnessValueChangedCommand}" CommandParameter="{Binding ElementName=BrightnessSlider}" />
</i:EventTrigger>
</i:Interaction.Triggers>
<i:Interaction.Behaviors>
<styles:SliderTouchBehavior />
</i:Interaction.Behaviors>
</Slider>
1. 通过Dxva2.dll台式PC上的显示器调节亮度
主要是通过当前窗口所在句柄,获取当前显示器的句柄,调用Dxva2.SetMonitorBrightness方法就可以了。
缺点:无法监听到亮度变化,可以自行通过定时器去监听
/// <summary>
/// 使用Dxva2.dll设置亮度
/// 用于设置台式电脑的屏幕亮度
/// </summary>
public class DxvaMonitorBrightness : IMonitorBrightness
{
/// <summary>
/// 亮度最小值
/// </summary>
public int Minimum { get; internal set; } = -1;
/// <summary>
/// 亮度最大值
/// </summary>
public int Maximum { get; internal set; } = -1;
/// <summary>
/// 是否支持设置亮度
/// </summary>
public bool AllowBrightness => Maximum != -1 && Minimum != -1;
/// <summary>
/// 显示器列表
/// </summary>
private readonly PhysicalMonitor[] _screen;
/// <summary>
/// 屏幕亮度设置构造函数
/// 外部通过<see cref="CreateDxvaMonitorBrightness"/>方法构造
/// </summary>
private DxvaMonitorBrightness(PhysicalMonitor[] screen)
{
_screen = screen;
}
/// <summary>
/// 获取屏幕亮度设置类
/// </summary>
/// <param name="handle">处于当前屏幕的窗口句柄</param>
/// <returns>若是非dxva支持的设备则返回null,若是支持则访问<see cref="DxvaMonitorBrightness"/>对象</returns>
public static DxvaMonitorBrightness CreateDxvaMonitorBrightness(IntPtr handle)
{
uint pdwNumberOfPhysicalMonitors = uint.MinValue;
var hMonitor = Win32.User32.MonitorFromWindow(handle, (uint)NativeConstantsEnum.MonitorDefaultToPrimary);
var bok = Win32.Dxva2.GetNumberOfPhysicalMonitorsFromHMONITOR(hMonitor, ref pdwNumberOfPhysicalMonitors);
var screen = new PhysicalMonitor[pdwNumberOfPhysicalMonitors];
bok = Win32.Dxva2.GetPhysicalMonitorsFromHMONITOR(hMonitor, pdwNumberOfPhysicalMonitors, screen);
short current = -1, minimum = -1, maximum = -1;
var getBrightness = Win32.Dxva2.GetMonitorBrightness(screen[0].PhysicalMonitorIntPtr, ref minimum, ref current, ref maximum);
return getBrightness ? new DxvaMonitorBrightness(screen) { Maximum = maximum, Minimum = minimum } :
throw new NotSupportedException($"此设备不支持的方法,GetLastError:{Win32.Kernel32.GetLastError()}");
}
/// <summary>
/// 获取亮度值
/// </summary>
/// <returns></returns>
public int GetBrightness()
{
short current = -1, minimum