UWP:BrightnessOverride StartOverride 逻辑 [英] UWP: BrightnessOverride StartOverride logic

查看:13
本文介绍了UWP:BrightnessOverride StartOverride 逻辑的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

有人知道StartOverride 方法逻辑?来自文档:

Does anybody know StartOverride method logic? From documentation:

开始覆盖的请求并不意味着屏幕亮度级别始终更改以匹配指定的覆盖亮度级别.仍然由系统决定是否遵守此覆盖请求.

The request to start overriding does not mean that the screen brightness level always changes to match the specified override brightness level. It's still up to the system to decide whether or not to honor this override request.

我写了一个简单的方法来调试亮度变化:

I've wrote simple method to debug brightness changes:

protected override void ApplyBrightness(double brightness)
{
    var brightnessOverride = BrightnessOverride.GetForCurrentView();
    Debug.WriteLine($"Try to change brightness from {brightnessOverride.BrightnessLevel} to {brightness}");

    void overrideActiveChangedHandler(BrightnessOverride sender, object e)
    {
        sender.IsOverrideActiveChanged -= overrideActiveChangedHandler;
        Debug.WriteLine($"BrightnessOverride IsOverrideActive changed to {sender.IsOverrideActive}");
    }

    void brightnessLevelChangedHandler(BrightnessOverride sender, object e)
    {
        sender.BrightnessLevelChanged -= brightnessLevelChangedHandler;
        Debug.WriteLine($"BrightnessOverride BrightnessLevel changed to {sender.BrightnessLevel}");
    }

    brightnessOverride.IsOverrideActiveChanged += overrideActiveChangedHandler;
    brightnessOverride.BrightnessLevelChanged += brightnessLevelChangedHandler;

    brightnessOverride.SetBrightnessLevel(brightness, DisplayBrightnessOverrideOptions.None);

    brightnessOverride.StartOverride();
}

并得到以下结果:

Try to change brightness from 0.83 to 0.23
BrightnessOverride IsOverrideActive changed to True
BrightnessOverride BrightnessLevel changed to 0.23
Try to change brightness from 0.23 to 0.53
BrightnessOverride IsOverrideActive changed to True
BrightnessOverride BrightnessLevel changed to 0.53
Try to change brightness from 0.53 to 0.14
Try to change brightness from 0.53 to 0.25
Try to change brightness from 0.53 to 0.7
BrightnessOverride IsOverrideActive changed to True
BrightnessOverride BrightnessLevel changed to 0.7

从这个测试中我可以看到,对于第一次亮度变化,可以降低亮度 (0.83 -> 0.23),但之后亮度只能增加 (0.23 -> 0.53, 0.53 -> 0.7).随后尝试降低它失败了:0.53 -> 0.14, 0.53 -> 0.25

From this test I can see that for the first brightness change it is possible to decrease brightness (0.83 -> 0.23), but after it brightness can be only increased (0.23 -> 0.53, 0.53 -> 0.7). Subsequent attempts to decrease it are failed: 0.53 -> 0.14, 0.53 -> 0.25

有人对这种奇怪的行为有解释吗?也许我错过了什么?是否有 100% 稳健的解决方案来控制应用程序亮度?

Does anybody have explanation to such odd behavior? Maybe I'm missing something? Is there 100% robust solution to control application brightness?

我的系统:Windows 10 Pro,版本 1709,操作系统内部版本 16299.125.应用程序目标和最低版本为 Windows 10 Creators Update (10.0; Build 15063)

My system: Windows 10 Pro, version 1709, OS build 16299.125. Application target and min versions are Windows 10 Creators Update (10.0; Build 15063)

推荐答案

我通过实验发现,BrightnessOverride.GetForCurrentView() 每次返回一个新的 BrightnessOverride 实例它被调用的时间.一个证据是,即使每次调用该方法时向实例添加新的事件处理程序,输出也只会出现一次.

I have found out experimentally, that the BrightnessOverride.GetForCurrentView() returns a new BrightnessOverride instance each time it is called. One evidence of this is the fact that even though you add new event handlers to the instance each time the method is called, the output appears only once.

这意味着,当您多次调用该方法时,您会创建多个 BrightnessOverride 实例,每个实例都有自己的值.我认为,因为 API 通常用于在有人从您的屏幕上扫描凭证代码时使屏幕更亮,所以当较低亮度覆盖出现而另一个高亮度覆盖处于活动状态时,它会被忽略(以保持高亮度请求).

This now means, that when you call the method multiple times, you create several BrightnessOverride instances each with its own value. I think that because the API is usually used to make the screen brighter when someone is scanning a voucher code from your screen, when a lower brightness override comes while another high brightness override is active, it is ignored (to keep honoring the high brightness request).

如果您想将亮度更改为任何值,您只需确保重用从 GetForCurrentView 调用中检索到的第一个实例,因为通过在该实例上设置新亮度,您将取消"原始请求.

If you want to change the brightness to any value, you just have to make sure you are reusing the first instance you have retrieved from GetForCurrentView call, because by setting a new brightness on that instance, you will "cancel" the original request.

private BrightnessOverride brightnessOverride = null;

private void InitializeBrightnessOverride()
{
    brightnessOverride = BrightnessOverride.GetForCurrentView();
    Debug.WriteLine($"Try to change brightness from {brightnessOverride.BrightnessLevel} to {brightness}");

    void overrideActiveChangedHandler(BrightnessOverride sender, object e)
    {
        sender.IsOverrideActiveChanged -= overrideActiveChangedHandler;
        Debug.WriteLine($"BrightnessOverride IsOverrideActive changed to {sender.IsOverrideActive}");
    }

    void brightnessLevelChangedHandler(BrightnessOverride sender, object e)
    {
        sender.BrightnessLevelChanged -= brightnessLevelChangedHandler;
        Debug.WriteLine($"BrightnessOverride BrightnessLevel changed to {sender.BrightnessLevel}");
    }

    brightnessOverride.IsOverrideActiveChanged += overrideActiveChangedHandler;
    brightnessOverride.BrightnessLevelChanged += brightnessLevelChangedHandler;
}

protected override void ApplyBrightness(double brightness)
{
    brightnessOverride.SetBrightnessLevel(brightness, DisplayBrightnessOverrideOptions.None);

    brightnessOverride.StartOverride();
}

现在您可以调用:

InitializeBrightnessOverride();
ApplyBrightness(0.7);
ApplyBrightness(0.14);

只需重用实例就足以完成这项工作.另外作为提示 - 要将屏幕恢复到原始亮度,您可以调用 StopOverride.

Just reusing the instance is enough to make this work. Also as a tip - to return the screen to the original brightness, you can call StopOverride.

这篇关于UWP:BrightnessOverride StartOverride 逻辑的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆