Автосмена темы и обоев на Windows: делаем красиво

Вчера Google выкатили апдейт Chrome OS, который вносит в систему темную тему оформления. Хотя еще 2018 году Apple представили macOS Mojave, одной из ключевых нововведений в которой стала темная тема и динамические обои. Фишка оказалась настолько бомбезной, и её добавили в iOS 13 через год. Вскоре темная тема появилась и в Android 10… И вроде бы все хорошо, но в Windows (более распространенной десктопной ОС) темная тема оформления появилась в 2016 году в Unniversary Update и до сих пор эту функцию не довели до ума. Итак, в этом гайде я расскажу как допилить темную тему, плюс как сделать динамические обои.

Пишем скрипт

Итак, как происходит изменение темы и обоев на Windows? Правильно, через реестр. Его мы можем редактировать через командную строчку или же через PowerShell. Через командную строку, сколько бы я не пробовал, мне не удалось что-либо изменить. Поискав на форумах нашел способы редактирования реестра через PowerShell. Итак, осталось найти где же хранятся записи для смены темы и обоев.

В данной записи реестра хранится путь к установленным обоям
А в этой записи хранится параметр, отвечающий за тему приложений

В папке HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Themes\Personalize содержится несколько записей, AppsUseLightTheme отвечает за темы приложений, а SystemUsesLightTheme за систему (панель пуск и таскбар). По желанию мы можем менять темы системы и приложений.

Кстати говоря, вот здесь можно задать настройки

В PowerShell менять реестр для смены обоев можно следующим образом:

Set-ItemProperty -Path HKCU:\Control Panel\Desktop -Name wallpaper -Value $path

Где вместо $path указывается путь к файлу. А тему:

Set-ItemProperty -Path HKCU:\SOFTWARE\Microsoft\Windows\CurrentVersion\Themes\Personalize -Name AppsUseLightTheme -Value $value -Type Dword -Force

Где вместо $value указывается 0 для темной темы, а 1 для светлой.

Эти настройки применяются при логине пользователя, так что чтобы после изменения записей реестра параметры считались нужно перезайти в систему или же запустить следующую строчку в PowerShell:

RUNDLL32.EXE user32.dll,UpdatePerUserSystemParameters ,1 ,True

Собираем скрипт

К сожалению последняя строчка срабатывает не с первого раза, так что запишем её в цикл. Ну и для удобства впишем предыдущие команды в отдельные функции:

Function Set-WallPaper($Value){
Set-ItemProperty -Path HKCU:\Control Panel\Desktop -Name wallpaper -Value $value
}
Function Set-Theme($Value){
Set-ItemProperty -Path HKCU:\SOFTWARE\Microsoft\Windows\CurrentVersion\Themes\Personalize -Name AppsUseLightTheme -Value $value -Type Dword -Force
}
Set-WallPaper -value "path to your dark wallpaper"
Set-Theme -value 0 # dark theme
for ($i = 0; $i -lt 5; $i++) {
RUNDLL32.EXE user32.dll,UpdatePerUserSystemParameters ,1 ,True
}
view raw dark.ps1 hosted with ❤ by GitHub

Собственно осталось автоматизировать процесс запуска данного скрипта. Можно было бы конечно два раза запускать один скрипт, который в зависимости от времени выбирал бы тему и обои, но у меня нет ни малейшего желания изучать как работать со временем в PowerShell. Так что напишем два скрипта, итак, второй скрипт для включения светлой темы:

Function Set-WallPaper($Value){
Set-ItemProperty -Path HKCU:\Control Panel\Desktop -Name wallpaper -Value $value
}
Function Set-Theme($Value){
Set-ItemProperty -Path HKCU:\SOFTWARE\Microsoft\Windows\CurrentVersion\Themes\Personalize -Name AppsUseLightTheme -Value $value -Type Dword -Force
}
Set-WallPaper -value "path to your light wallpaper"
Set-Theme -value 1 # light theme
for ($i = 0; $i -lt 5; $i++) {
RUNDLL32.EXE user32.dll,UpdatePerUserSystemParameters ,1 ,True
}
view raw light.ps1 hosted with ❤ by GitHub

Если при запуске скрипта у вас не всегда меняются обои, то стоит увеличить количество итераций в цикле (вместо 5 вписать 10 например)

Автоматизация запуска скрипта

Для того что бы автоматизировать весь процесс я воспользовался планировщиком заданий.

Планировщик можно найти в меню Пуск в папке Средства администрирования Windows
В планировщике жмем правую кнопку мыши, затем создать простую задачу…
Выбираем название
Триггер ставим на Ежедневно
В данном случае задача для переключения на темную тему и обои, по этому выбираем удобное время
Действие: запустить программу
В качестве программы выбираем интерпретатор PowerShell, а в качестве аргументов указываем путь к скрипту

На этом все, осталось создать такую же задачу для включения светлой темы и обоев. Все бы хорошо, но как говорится нет предела совершенству. При запуске задания на секунду появляется окно интерпретатора, а хотелось бы чуда. Я нашел скрипт для скрытого запуска PowerShell-скрипта. Вместо pathToYourScrpt.ps1 пишем путь к скрипту, придется создавать два VBScript файла для каждого PowerShell-скрипта:

Dim objShell,objFSO,objFile
Set objShell=CreateObject("WScript.Shell")
Set objFSO=CreateObject("Scripting.FileSystemObject")
'enter the path for your PowerShell Script
strPath="pathToYourScrpt.ps1"
'verify file exists
If objFSO.FileExists(strPath) Then
'return short path name
set objFile=objFSO.GetFile(strPath)
strCMD="powershell -nologo -command " & Chr(34) & "&{" &_
objFile.ShortPath & "}" & Chr(34)
'Uncomment next line for debugging
'WScript.Echo strCMD
'use 0 to hide window
objShell.Run strCMD,0
Else
'Display error message
WScript.Echo "Failed to find " & strPath
WScript.Quit
End If
view raw script.vbs hosted with ❤ by GitHub

В планировщике, вместо PowerShell.exe указываем путь к скрипту, не забываем очистить аргументы

На этом все! В интернете можно найти кучу парных обоев, часто это будут обои из macOS и iOS. Ссылка на этот проект на Githubе. Всем добра!

Источники

  1. https://www.androidcentral.com/chrome-os-finally-getting-dark-mode
  2. https://en.wikipedia.org/wiki/Android_10
  3. https://en.wikipedia.org/wiki/IOS_13
  4. https://en.wikipedia.org/wiki/MacOS_Mojave
  5. https://trashbox.ru/topics/101690/yubilejnoe-obnovlenie-windows-10-obzor-novovvedenij#chapter-4
  6. https://docs.microsoft.com/ru-ru/powershell/scripting/learn/ps101/09-functions?view=powershell-7
  7. https://social.technet.microsoft.com/Forums/ie/en-US/72a9b4bf-071b-47cd-877d-0c0629a9eb90/how-change-the-wallpaperbackground-with-a-command-line-?forum=w7itproui
  8. https://levashove.ru/temnaya-tema-interfejsa-windows-10-ruchnoe-i-avtomaticheskoe-vklyuchenie/
  9. http://web.archive.org/web/20070216074902/http://blog.sapien.com/current/2006/12/20/schedule-hidden-powershell-tasks.html