Jak mogę znaleźć ścieżkę do bieżącego obrazu pulpitu dla systemu Windows 8

10

Po niedawnym uaktualnieniu do systemu Windows 8 mój skrypt pobierania aktualnego obrazu tapety pulpitu jest uszkodzony.

W przypadku systemu Windows 7, jak mogę znaleźć ścieżkę do bieżącego obrazu pulpitu? , to działa świetnie. Jednak ten klucz rejestru zawsze zawiera teraz

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

Jakiego nowego klucza rejestru używa się w systemie Windows 8?

Znalazłem dwa możliwe rozwiązania.

Po pierwsze, ten klucz zawiera coś, co wygląda jak ścieżka zakodowana w Base64:

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

Jest też „plik właściwości motywu niestandardowego”, który zawiera również sekcję „[SlideShow]”, która wygląda jak Base64:

C:\Users\Scott\AppData\Local\Microsoft\Windows\Themes\Custom.theme
Scott Bennett-McLeish
źródło
Interesują mnie pozornie (ale najwyraźniej nie) wpisy rejestru zakodowane w base64. Dlaczego Microsoft miałby je tak kodować? Co zyskasz, ukrywając te podstawowe informacje?
Synetech,

Odpowiedzi:

10

Dwa poniższe klucze rejestru przechowują oryginalną ścieżkę bieżącego obrazu tapety:

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

Są w formacie Unicode, po ich zdekodowaniu uzyskamy pełną ścieżkę do bieżącego obrazu tapety.

Scott Bennett-McLeish
źródło
2
Wyjaśnienie dla każdego, kto się tym bawi: wartość zawiera dane nieciągłe w pierwszych 24 bajtach, a pozostałe dane to ciąg znaków zakodowany w Unicode, zakończony znakiem null (\ 0). Szczęśliwego parsowania.
Nathan Taylor
W PowerShell, [System.Text.Encoding]::Unicode.GetString($bytes[24..($bytes.length-1)])zakładając, że $byteszawiera wartość klucza
NextInLine
2
pełny twoliner 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]
Mark Harviston
3
  1. Idź do Windows Run Command (WinLogo + R)
  2. Wpisz:% AppData%
  3. W folderze „Roaming” przejdź do „Microsoft”, następnie „Windwows”, następnie „Motywy”, a na koniec „CachedFiles”
  4. Skopiuj plik tapety.
Gilbert
źródło
To takie proste i szybkie. Złapałem plik, zmieniłem rozszerzenie na .jpg i już było.
valsidalv
2

Sprawdź wartość HKEY_CURRENT_USER\Control Panel\Desktop\WallpaperREG_SZ (ciąg). Spowoduje to wyświetlenie ścieżki do aktualnie używanego pliku TranscodedWallpaper.jpg.

Karan
źródło
Dziękuję Ci! To wskazało mi przynajmniej prawidłową lokalizację rejestru. Chciałem nie tylko bieżącą tapetę, ale ścieżkę do oryginalnego pliku (podobnie jak Windows 7), który znajduje się we wpisie TranscodedImageCache.
Scott Bennett-McLeish,
2

W Windows 8 i 8.1 (i podobno 10), jeśli ustawiłeś tapetę z Windows Picture Viewer (otwierając zdjęcie w Viewer i klikając „Ustaw jako tapetę pulpitu” w menu kontekstowym), jego lokalizacja będzie

%AppData%\Roaming\Microsoft\Windows Photo Viewer\Windows Photo Viewer Wallpaper.jpg
Artanis
źródło
1

W mojej sytuacji mam olbrzymi folder zdjęć, przez które przechodzą moje tapety. Nudzę się po pewnym czasie i chcę je usunąć, a czasem po prostu zastanawiam się, jaka jest nazwa obrazu, ponieważ może zawierać opis obrazu.

Zbudowałem 2 skrypty na podstawie powyższej opinii - jeden, aby uzyskać bieżącą ścieżkę obrazu, a drugi, aby ją usunąć. Testowałem to tylko w systemie Windows 10.

Uzyskaj ścieżkę obrazu (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');

Usuń obraz (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)
Chris Smith
źródło
1
  1. Idź do C:\Users\<USERNAME>\AppData\Roaming\Microsoft\Windows\Themes.
  2. Utwórz kopię TranscodedWallpaper
  3. Zmień nazwę kopii na <NAME>.JPG

Testowane w systemie Windows 10

keinabel
źródło