UWP: логика запуска BrightnessOverride
Кто-нибудь знает логику метода StartOverride? Из документации:
Запрос на переопределение не означает, что уровень яркости экрана всегда изменяется в соответствии с указанным уровнем яркости переопределения. Система все еще должна решить, удовлетворять или нет этот запрос на переопределение.
Я написал простой метод для отладки изменений яркости:
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
У кого-нибудь есть объяснение такому странному поведению? Может я что-то упустил? Существует ли 100% надежное решение для управления яркостью приложения?
Моя система: Windows 10 Pro, версия 1709, сборка ОС 16299.125. Целевой и минимальной версиями приложения являются Windows 10 Creators Update (10.0; сборка 15063).
1 ответ
Я экспериментально выяснил, что BrightnessOverride.GetForCurrentView()
возвращает новый BrightnessOverride
экземпляр каждый раз, когда это называется. Одним из доказательств этого является тот факт, что даже если вы добавляете новые обработчики событий в экземпляр при каждом вызове метода, вывод появляется только один раз.
Теперь это означает, что когда вы вызываете метод несколько раз, вы создаете несколько BrightnessOverride
экземпляры каждый со своим значением. Я думаю, что, поскольку API обычно используется для того, чтобы сделать экран ярче, когда кто-то сканирует код ваучера с вашего экрана, когда происходит переопределение более низкой яркости, когда активно другое переопределение высокой яркости, оно игнорируется (чтобы сохранить запрос высокой яркости).
Если вы хотите изменить яркость на любое значение, вам просто нужно убедиться, что вы повторно используете первый экземпляр, который вы извлекли из GetForCurrentView
звоните, потому что, установив новую яркость для этого экземпляра, вы "отмените" исходный запрос.
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
,