Как упоминалось в этом другом ответе, когда вы устанавливаете изображение экрана блокировки, 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