Налаштування Windows Creators оновлення нічного світла за допомогою реєстру


13

Як можна налаштувати нову функцію Night Light у Windows 10 (Pro) Creators Update через реєстр?

Я хотів би автоматично налаштувати нові / оновлені установки, використовуючи мій інструмент управління конфігурацією на вибір (шеф-кухар). Перевірка системи через монітор процесів Sysinternals показує, що бінарний Dataключ оновлюється вглиб HKCU\Software\Microsoft\Windows\CurrentVersion\CloudStore\Cache\DefaultAccount\$$windows.data.bluelightreduction.settings\Current, але це велика крапка REG_BINARY і не дуже корисна.

Довідка про інший реєстр, PowerShell чи інший спосіб автоматичного налаштування функції Night Light буде найбільш вдячна!


використовуйте RegfromApp, щоб простежити його краще. він генерує файл .reg. можливо, це може розшифрувати
magicandre1981

Дякую за пропозицію @ magicandre198. Монітор процесів дає мені точний ключ та значення, що змінюються. Проблема полягає в тому, що ключ є двійковим і немає доступної документації щодо декодування для того, як цей ключ даних будується. З огляду на фанки, про який йде мова, це може бути не розділ, призначений для прямої модифікації (можливо, розташування кешованих налаштувань). Я сподіваюся, що хтось має лінійку щодо управління новою функцією Night Light, оскільки поки що, здається, не так багато інформації.
Девід Ф. Северський

як я вже сказав, використовуйте Regfromapp, він створює .reg файли для кожної зміни.
magicandre1981

1
Тут ми можемо говорити на перехресні цілі. :) Я знаю ключ і вміст ключа, який коригується. Це просто незручна крапля без документації. Я знайшов github.com/jaapbrasser/SharedScripts/tree/master/Set-BlueLight, який трохи зламає, щоб надати PS-інтерфейс функції, але не ясно, як поєднувати різні налаштування разом. Я дуже шукаю документацію (та інтерфейс) про те, як складено цей двійковий рядок.
Девід Ф. Северський

Відповіді:


12

За допомогою експерименту мені вдалося більш-менш опрацювати формат цього значення реєстру (детальніше про це див. Нижче).

Я зробив цей сценарій PowerShell:

Function Set-BlueLightReductionSettings {
    [CmdletBinding()]
    Param (
        [Parameter(Mandatory=$true)] [ValidateRange(0, 23)] [int]$StartHour,
        [Parameter(Mandatory=$true)] [ValidateSet(0, 15, 30, 45)] [int]$StartMinutes,
        [Parameter(Mandatory=$true)] [ValidateRange(0, 23)] [int]$EndHour,
        [Parameter(Mandatory=$true)] [ValidateSet(0, 15, 30, 45)] [int]$EndMinutes,
        [Parameter(Mandatory=$true)] [bool]$Enabled,
        [Parameter(Mandatory=$true)] [ValidateRange(1200, 6500)] [int]$NightColorTemperature
    )
    $data = (2, 0, 0, 0)
    $data += [BitConverter]::GetBytes((Get-Date).ToFileTime())
    $data += (0, 0, 0, 0, 0x43, 0x42, 1, 0)
    If ($Enabled) {$data += (2, 1)}
    $data += (0xCA, 0x14, 0x0E)
    $data += $StartHour
    $data += 0x2E
    $data += $StartMinutes
    $data += (0, 0xCA, 0x1E, 0x0E)
    $data += $EndHour
    $data += 0x2E
    $data += $EndMinutes
    $data += (0, 0xCF, 0x28)
    $tempHi = [Math]::Floor($NightColorTemperature / 64)
    $tempLo = (($NightColorTemperature - ($tempHi * 64)) * 2) + 128
    $data += ($tempLo, $tempHi)
    $data += (0xCA, 0x32, 0, 0xCA, 0x3C, 0, 0)
    Set-ItemProperty -Path 'HKCU:\Software\Microsoft\Windows\CurrentVersion\CloudStore\Store\Cache\DefaultAccount\$$windows.data.bluelightreduction.settings\Current' -Name 'Data' -Value ([byte[]]$data) -Type Binary
}

Щоб використовувати його, збережіть його як .ps1файл та дотримуйтесь інструкцій у розділі Включення сценаріїв у вікі тегів PowerShell . Потім ви можете імпортувати вміст сценарію за допомогою точкового пошуку:

. ./bluelightmanagement.ps1

А потім використовуйте функцію cmdlet, яку вона постачає:

Set-BlueLightReductionSettings -StartHour 7 -StartMinutes 0 -EndHour 21 -EndMinutes 15 -Enabled $true -NightColorTemperature 6000

результати

Додаток "Налаштування" навіть оновлює все (крім повзунка кольорів) негайно, якщо під час запуску команди відкрита сторінка зменшення синього світла.

Формат

  • 4 постійних байти - здавалося б, підпис, спільний для всіх CloudStoreзначень
  • Остання зміна часу налаштування як 64-бітове FILETIMEзначення (8 байт, мало ендіан)
  • Ще 8 постійних байтів
  • Байти 2потім , 1якщо синє світло функція шумозаглушення включена, тільки що , якщо він відключений
  • Ще 3 постійних байти
  • Година часу початку (1 байт)
  • 1 постійний байт
  • Хвилини часу початку (1 байт)
  • 4 постійні байти
  • Година часу закінчення (1 байт)
  • 1 постійний байт
  • Хвилини часу закінчення (1 байт)
  • 3 постійних байта
  • Нічна кольорова температура в Кельвіні після дивної двійкової математики (2 байти)
  • 7 постійних байтів

Колірна температура зберігається у вигляді двох байтів у маленькому ендіані. Однозначне - це ціла частина результату ділення температури на 64. Байт низького значення - решта, помножена на два, потім додана до 128. Для обчислення температури з байтів помножте високий байт на 64 і додайте те, що ви отримаєте, розділивши вдвічі різницю між низьким байтом і 128.


Я намагаюся написати сценарій, щоб тільки вмикати та вимикати нічне світло. Якщо я не помиляюся, байти 20 і 21 повинні вказувати, чи функція ввімкнена (згідно вашого опису принаймні з 4 + 8 + 8 = 20), але коли я дивлюся на запис у реєстрі за допомогою regedit, я не див. зміни байтів 21, я не бачу жодної зміни з цього приводу. Я переконався, що оновив вікно regedit за допомогою F5 і навіть його знову відкрив після того, як увімкнув функцію нічного освітлення від інтерфейсу користувача. Чи маєте ви уявлення про те, що відбувається?
Габойк1

1
Я також встановив, використовуючи цю утиліту від NirSoft nirsoft.net/articles/find_modified_time_registry_key.html , що вказаний вами ключ реєстру взагалі не змінюється, коли я активую та відключаю функцію нічного освітлення. Можливо, Microsoft змінив його в останньому оновлення?
Габойк1

1
@ Gaboik1 Це значення реєстру є дивним тим, що його макет сильно змінюється; описаний я формат - це лише той, який працює, не обов'язково єдиний. Я не знаю способу послідовно читати дані з цього значення, але я протестував на Windows 10 1709 і за допомогою цього скрипту для встановлення налаштувань усе ще працює.
Ben N

Записуючи це у .net, я виявив, що фактично використовую графік (проти вашого коду, який, здається, відбувається на сході сонця / заході сонця), я мав додати байти 0xC2,0x0A, 0x00 перед CA 14 0E. Тоді це запустить і встановить його на години. Інакше це спрацювало. 1709.
Мгамерц

1
На сьогодні, останнє оновлення, це більше не працює. Ключ реєстру модифікований, \Software\Microsoft\Windows\CurrentVersion\CloudStore\Store\DefaultAccount\Current\default$windows.data.bluelightreduction.settings\windows.data.bluelightreduction.settings\Dataі, на жаль, бінарний формат не той.
Жульєн__

2

Кілька годин експериментів і вуаля:
Як увімкнути / вимкнути нічне світло в Win10 1903

Ключ реєстру :

HKCU\Software\Microsoft\Windows\CurrentVersion\CloudStore\Store\DefaultAccount\Current\default$windows.data.bluelightreduction.bluelightreductionstate\windows.data.bluelightreduction.bluelightreductionstate\

Назва значення : Дані

Щоб увімкнути нічне світло :

  1. Додайте байти "10" та "00" до даних в 24 та 25 індексах відповідно, щоб вся довжина даних збільшувалася (не змінюйте існуючі значення, просто додайте ще два байти)
  2. Значення приросту в 11 або 12 індексах на 1 (наприклад: якщо це був FF 01, ніж зараз, то це має бути відповідно 00 02) Насправді, здається, прийшов час, і він записаний у 8 байт у маленькому ендіанському форматі, тому вам знадобиться також 13, 14, 15, 16, 17 та 18 індексів, якщо ви хочете зробити це точно.

Щоб вимкнути нічне освітлення :

  1. Видаліть байти "10" та "00" з даних за 24 та 25 індексами відповідно, щоб уся довжина даних зменшувалася
  2. Значення приросту в 11 або 12 індексах на 1 (наприклад: якщо це було FF 01, ніж зараз, воно повинно бути відповідно 00 02)

Мені потрібно було лише увімкнути / вимкнути нічне світло для своєї програми, тому, на жаль, всі інші варіанти все ще потребують дослідження. Але здається, що ключовим варіантом для всіх інших виправлень (наприклад, зміни температури та розкладу) є належне збільшення часу. Ці моди потрібно виконати в іншому значенні даних у сусідньому ключі реєстру windows.data.bluelightreduction.settings.


Чи трапляється у вас сценарій, який дозволить відключити це випадково?
метаморфоза

ні. я написав невелику програму в C.
hgrev

все-таки буде корисно (як мінімум, для мене), якщо ви можете опублікувати посилання. Я працюю в C / C ++
метаморфоза

ви хочете код або файл EXE?
hgrev

1
Ось вихідний код та виконуваний файл: github.com/inamozov/DisplayTest
hgrev
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.