Как уже упоминалось в этом другом ответе, когда вы устанавливаете изображение экрана блокировки, Windows копирует выбранное изображение в специальное место, поэтому изменение исходного файла не изменит отображаемую копию. Вероятно, существует некоторое кэширование по оригинальному имени файла, которое не обновляет его при повторном выборе «того же» файла изображения. Поиск в двоичных значениях реестра, упомянутых в этом ответе, кажется, поддерживает идею, что Windows записывает исходное имя файла.
Поскольку у вас уже есть пакетный скрипт для поворота файлов изображений, все, что нам нужно сделать, - это заставить Windows обновить изображение из файла текущего фона. Чтобы заставить Windows сделать это, вы можете использовать PowerShell! Соединяя фрагменты, которые я объяснил в своем ответе на аналогичный вопрос, и добавляя логику, чтобы каждый раз делать копию с произвольным именем, мы получаем этот скрипт:
# Change this to the path where you keep the desired background image $imagePath = 'C:\path\to\image.ext' $newImagePath = [System.IO.Path]::GetDirectoryName($imagePath) + '\' + (New-Guid).Guid + [System.IO.Path]::GetExtension($imagePath) Copy-Item $imagePath $newImagePath [Windows.System.UserProfile.LockScreen,Windows.System.UserProfile,ContentType=WindowsRuntime] | Out-Null Add-Type -AssemblyName System.Runtime.WindowsRuntime $asTaskGeneric = ([System.WindowsRuntimeSystemExtensions].GetMethods() | ? { $_.Name -eq 'AsTask' -and $_.GetParameters().Count -eq 1 -and $_.GetParameters()[0].ParameterType.Name -eq 'IAsyncOperation`1' })[0] Function Await($WinRtTask, $ResultType) { $asTask = $asTaskGeneric.MakeGenericMethod($ResultType) $netTask = $asTask.Invoke($null, @($WinRtTask)) $netTask.Wait(-1) | Out-Null $netTask.Result } Function AwaitAction($WinRtAction) { $asTask = ([System.WindowsRuntimeSystemExtensions].GetMethods() | ? { $_.Name -eq 'AsTask' -and $_.GetParameters().Count -eq 1 -and !$_.IsGenericMethod })[0] $netTask = $asTask.Invoke($null, @($WinRtAction)) $netTask.Wait(-1) | Out-Null } [Windows.Storage.StorageFile,Windows.Storage,ContentType=WindowsRuntime] | Out-Null $image = Await ([Windows.Storage.StorageFile]::GetFileFromPathAsync($newImagePath)) ([Windows.Storage.StorageFile]) AwaitAction ([Windows.System.UserProfile.LockScreen]::SetImageFileAsync($image)) Remove-Item $newImagePath
Измените путь к изображению в верхней части скрипта, затем сохраните скрипт как .ps1
файл (например lockscr.ps1
) в той же папке, что и пакетный файл перетасовки изображений. Если вы этого еще не сделали, следуйте инструкциям в разделе «Включение сценариев» вики-тега PowerShell, чтобы разрешить запуск сценариев PowerShell. Затем измените пакетный файл, чтобы он запускал скрипт PowerShell после перемещения изображений:
powershell -file .\lockscr.ps1