Как я могу узнать путь к текущему образу рабочего стола, для Windows 8


10

Недавно обновленный до Windows 8 мой скрипт для получения текущего изображения рабочего стола сломался.

Для Windows 7, как я могу узнать путь к текущему образу рабочего стола? , это прекрасно работает. Однако этот раздел реестра теперь всегда содержит

C:\Windows\web\wallpaper\Windows\img0.jpg

Какой новый раздел реестра используется для Windows 8?

Я нашел два возможных решения.

Во-первых, этот ключ содержит то, что выглядит как закодированный путь Base64:

HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\Wallpapers\Images\ID2

А затем есть «файл свойств пользовательской темы», который также содержит раздел «[SlideShow]», который выглядит как Base64:

C:\Users\Scott\AppData\Local\Microsoft\Windows\Themes\Custom.theme

Меня интересуют, казалось бы, (но, видимо, нет) записи реестра в кодировке base64. Почему Microsoft так их кодирует? Какая польза от сокрытия этой базовой информации?
Synetech

Ответы:


10

Два раздела реестра под обоими хранят исходный путь текущего фонового изображения:

HKEY_CURRENT_USER\Control Panel\Desktop\TranscodedImageCache
HKEY_CURRENT_USER\Control Panel\Desktop\TranscodedImageCache_000

Они в формате Unicode, после декодирования, у каждого будет полный путь к текущему фоновому изображению.


2
Просто пояснение для любого, кто возится с этим: значение содержит не строковые данные в первых 24 байтах, а остальные данные представляют собой строку в кодировке Unicode с нулевым символом в конце (\ 0). Удачного разбора.
Натан Тейлор

В PowerShell это [System.Text.Encoding]::Unicode.GetString($bytes[24..($bytes.length-1)]), предполагая, $bytesсодержит значение ключа
NextInLine

2
полный twoller powershell:$bytes=(New-Object -ComObject WScript.Shell).RegRead("HKEY_CURRENT_USER\Control Panel\Desktop\TranscodedImageCache_000"); $path=([System.Text.Encoding]::Unicode.GetString($bytes[24..($bytes.length-1)]) -split "\0")[0]
Марк Харвистон

3
  1. Перейти к команде запуска Windows (WinLogo + R)
  2. Введите:% AppData%
  3. В папке «Roaming» перейдите в «Microsoft», затем «Windwows», «Themes» и, наконец, «CachedFiles».
  4. Скопируйте файл обоев.

Это так просто и быстро. Я схватил файл, изменил расширение на .jpg и вот оно.
valsidalv

2

Проверьте значение HKEY_CURRENT_USER\Control Panel\Desktop\WallpaperREG_SZ (строка). Это покажет вам путь к TranscodedWallpaper.jpg в настоящее время используется.


Спасибо! Это указало мне на правильное местоположение реестра по крайней мере. Я хотел не только текущие обои, но и путь к исходному файлу (как в Windows 7), который находится в записи TranscodedImageCache.
Скотт Беннетт-Маклиш


2

В Windows 8 и 8.1 (и, как сообщается, 10), если вы установили обои в Windows Picture Viewer (открыв изображение в Viewer и нажав «Установить в качестве обоев рабочего стола» в контекстном меню), его местоположение будет

%AppData%\Roaming\Microsoft\Windows Photo Viewer\Windows Photo Viewer Wallpaper.jpg

1

В моей ситуации у меня есть огромная папка с изображениями, через которые проходят мои обои. Через некоторое время мне становится скучно, и я хочу удалить их, а иногда мне просто интересно, как называется изображение, потому что оно может содержать описание изображения.

Я создал 2 сценария на основе приведенных выше отзывов - один для получения текущего пути к изображению и один для его удаления. Только проверено это на Windows 10.

Получить путь к изображению (getwallpaper.ps1)

$bytes=(New-Object -ComObject WScript.Shell).RegRead("HKEY_CURRENT_USER\Control Panel\Desktop\TranscodedImageCache")
$wallpaperpath=[System.Text.Encoding]::Unicode.GetString($bytes[24..($bytes.length-1)])
$wallpaperpath=$wallpaperpath.substring(0, $wallpaperpath.IndexOf("jpg", 0, $wallpaperpath.Length)+3)
write-output $wallpaperpath
Write-Host -NoNewLine 'Press any key to continue...';
$null = $Host.UI.RawUI.ReadKey('NoEcho,IncludeKeyDown');

Удалить изображение (deletewallpaper.ps1)

$bytes=(New-Object -ComObject WScript.Shell).RegRead("HKEY_CURRENT_USER\Control Panel\Desktop\TranscodedImageCache")
$wallpaperpath=[System.Text.Encoding]::Unicode.GetString($bytes[24..($bytes.length-1)])
$wallpaperpath=$wallpaperpath.substring(0, $wallpaperpath.IndexOf("jpg", 0, $wallpaperpath.Length)+3)
write-output $wallpaperpath
Write-Host -NoNewLine 'Delete the file (y=yes)?'
$KeyOption = 'Y','N'
while ($KeyOption -notcontains $KeyPress.Character) {
 $KeyPress = $host.UI.RawUI.ReadKey("NoEcho,IncludeKeyDown")
 if($KeyPress.Character -eq 'y') { Remove-Item $wallpaperpath }
}
Write-Host
[Environment]::Exit(0)

1
  1. Перейти к C:\Users\<USERNAME>\AppData\Roaming\Microsoft\Windows\Themes.
  2. Создать копию TranscodedWallpaper
  3. Переименовать копию в <NAME>.JPG

Проверено на Windows 10

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.