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

А потім є "спеціальний файл властивостей теми", який також містить розділ "[Слайд-шоу]", який виглядає як 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
повна потужність кулера:$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. У папці "Роумінг" перейдіть до "Microsoft", потім "Windwows", потім "Теми" та нарешті "CachedFiles"
  4. Скопіюйте файл шпалер.

Це так просто і швидко. Я схопив файл, змінив розширення на .jpg і там воно було.
valsidalv

2

Перевірте значення HKEY_CURRENT_USER\Control Panel\Desktop\WallpaperREG_SZ (рядок). Це покаже вам шлях до TranscodedWallpaper.jpg, який використовується зараз.


Дякую! Принаймні, це вказало на правильне розташування реєстру. Я хотів не лише поточних шпалер, але й шлях до оригінального файлу (як це зробив Window 7), який знаходиться у записі TranscodedImageCache.
Скотт Беннетт-Макліш


2

Якщо в Windows 8 і 8.1 (і, як повідомляється, 10), ви встановили шпалери з програми перегляду зображень Windows (відкривши малюнок у програмі перегляду та натиснувши в контекстному меню "Встановити як шпалери для робочого столу"), його місцезнаходження буде

%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.