Вчера 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 | |
| } |
Собственно осталось автоматизировать процесс запуска данного скрипта. Можно было бы конечно два раза запускать один скрипт, который в зависимости от времени выбирал бы тему и обои, но у меня нет ни малейшего желания изучать как работать со временем в 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 | |
| } |
Если при запуске скрипта у вас не всегда меняются обои, то стоит увеличить количество итераций в цикле (вместо 5 вписать 10 например)
Автоматизация запуска скрипта
Для того что бы автоматизировать весь процесс я воспользовался планировщиком заданий.







На этом все, осталось создать такую же задачу для включения светлой темы и обоев. Все бы хорошо, но как говорится нет предела совершенству. При запуске задания на секунду появляется окно интерпретатора, а хотелось бы чуда. Я нашел скрипт для скрытого запуска 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 |
В планировщике, вместо PowerShell.exe указываем путь к скрипту, не забываем очистить аргументы

На этом все! В интернете можно найти кучу парных обоев, часто это будут обои из macOS и iOS. Ссылка на этот проект на Githubе. Всем добра!
Источники
- https://www.androidcentral.com/chrome-os-finally-getting-dark-mode
- https://en.wikipedia.org/wiki/Android_10
- https://en.wikipedia.org/wiki/IOS_13
- https://en.wikipedia.org/wiki/MacOS_Mojave
- https://trashbox.ru/topics/101690/yubilejnoe-obnovlenie-windows-10-obzor-novovvedenij#chapter-4
- https://docs.microsoft.com/ru-ru/powershell/scripting/learn/ps101/09-functions?view=powershell-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
- https://levashove.ru/temnaya-tema-interfejsa-windows-10-ruchnoe-i-avtomaticheskoe-vklyuchenie/
- http://web.archive.org/web/20070216074902/http://blog.sapien.com/current/2006/12/20/schedule-hidden-powershell-tasks.html