Como mencionado em esta outra resposta , quando você define uma imagem da tela de bloqueio, o Windows copia a imagem selecionada para um especial localização, portanto, alterar o arquivo original não alterará a cópia exibida. Provavelmente, há algum armazenamento em cache pelo nome do arquivo original que faz com que ele não seja atualizado quando você seleciona novamente o arquivo de imagem "mesmo". Examinar os valores binários do Registro mencionados nessa resposta parece apoiar a ideia de que o Windows registra o nome do arquivo original.
Como você já tem um script em lotes para girar pelos arquivos de imagem, tudo o que precisamos fazer é fazer com que o Windows atualize a imagem a partir do arquivo de segundo plano atual. Para forçar o Windows a fazer isso, você pode usar o PowerShell! Reunindo os fragmentos que expliquei em minha resposta a uma pergunta semelhante e adicionando alguma lógica para fazer uma cópia nomeada aleatoriamente a cada vez, nós recebemos este script:
# 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
Altere o caminho da imagem na parte superior do script e salve o script como um arquivo .ps1
(por exemplo, lockscr.ps1
) na mesma pasta do arquivo em lote de embaralhamento de imagens. Se ainda não o fez, siga as instruções na seção Habilitando Scripts do wiki de tags do PowerShell para permitir que os scripts do PowerShell sejam executados . Em seguida, altere seu arquivo em lotes para executar o script do PowerShell depois de fazer imagens em movimento:
powershell -file .\lockscr.ps1