Як було зазначено в цій іншій відповіді , під час встановлення зображення блокованого екрана 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