Reputation: 192
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();
}
And get following results:
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
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
Does anybody have explanation to such odd behavior? Maybe I'm missing something? Is there 100% robust solution to control application brightness?
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)
Upvotes: 4
Views: 1043
Reputation: 39072
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.
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).
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();
}
Now you can call:
InitializeBrightnessOverride();
ApplyBrightness(0.7);
ApplyBrightness(0.14);
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
.
Upvotes: 3