Я хочу, чтобы изображение на экране блокировки автоматически менялось, поэтому оно меняется каждый раз, когда я захожу на компьютер. Мне не нравится опция слайд-шоу, так как она добавляет эффект панорамирования и масштабирования, который меня раздражает.

Я попытался добиться этого с помощью командного файла, чтобы заменить изображение, которое я выбрал для фона, другим изображением, однако это не меняет фон экрана блокировки. Что еще более странно, это то, что даже если я вручную изменю изображение, но сохраню то же имя, когда я выберу его в настройках в качестве изображения экрана блокировки, оно останется таким же, каким оно было при первом выборе. Я не знаю, почему это происходит, кто-нибудь знает, как это исправить, поскольку это единственный способ автоматически изменить фон экрана блокировки.

Я на Windows 10

1 ответ1

0

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .