Wie kann ich den Pfad zum aktuellen Desktop-Image für Windows 8 ermitteln?

10

Nach dem kürzlich durchgeführten Upgrade auf Windows 8 ist mein Skript zum Abrufen des aktuellen Desktop-Hintergrundbilds fehlerhaft.

Wie kann ich unter Windows 7 den Pfad zum aktuellen Desktop-Image ermitteln? , das funktioniert super. Dieser Registrierungsschlüssel enthält jetzt jedoch immer

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

Was ist der neue Registrierungsschlüssel für Windows 8?

Ich habe zwei mögliche Lösungen gefunden.

Erstens enthält dieser Schlüssel einen Base64-codierten Pfad:

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

Und dann gibt es noch die "Datei mit benutzerdefinierten Designeigenschaften", die auch einen Abschnitt "[SlideShow]" enthält, der wie Base64 aussieht:

C:\Users\Scott\AppData\Local\Microsoft\Windows\Themes\Custom.theme
Scott Bennett-McLeish
quelle
Ich interessiere mich für die scheinbar (aber anscheinend nicht) base64-codierten Registrierungseinträge. Warum sollte Microsoft sie so codieren? Was bringt es, diese grundlegenden Informationen zu verbergen?
Synetech

Antworten:

10

Die beiden Registrierungsschlüssel unter beiden speichern den ursprünglichen Pfad des aktuellen Hintergrundbilds:

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

Sie sind im Unicode-Format. Wenn Sie das dekodieren, haben Sie den vollständigen Pfad zum aktuellen Hintergrundbild.

Scott Bennett-McLeish
quelle
2
Nur eine Klarstellung für alle, die damit herumspielen: Der Wert enthält Nicht-String-Daten in den ersten 24 Bytes, und die verbleibenden Daten sind Unicode-codierte, nullterminierte (\ 0) Zeichenfolgen. Viel Spaß beim Parsen.
Nathan Taylor
In Powershell wird davon [System.Text.Encoding]::Unicode.GetString($bytes[24..($bytes.length-1)])ausgegangen, dass $bytesder Wert des Schlüssels enthalten ist
NextInLine
2
volle 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. Gehen Sie zu Windows Run Command (WinLogo + R).
  2. Geben Sie Folgendes ein:% AppData%
  3. Gehen Sie im Ordner "Roaming" zu "Microsoft", dann zu "Windwows", dann zu "Themes" und zuletzt zu "CachedFiles".
  4. Kopieren Sie die Hintergrunddatei.
Gilbert
quelle
Das ist so einfach und schnell. Ich griff nach der Datei, änderte die Erweiterung in .jpg und da war sie.
Valsidalv
2

Überprüfen Sie den HKEY_CURRENT_USER\Control Panel\Desktop\WallpaperWert REG_SZ (Zeichenfolge). Dies zeigt Ihnen den Pfad zu der aktuell verwendeten TranscodedWallpaper.jpg.

Karan
quelle
Vielen Dank! Das hat mich zumindest auf den richtigen Registrierungsort hingewiesen. Ich wollte nicht nur das aktuelle Hintergrundbild, sondern auch den Pfad zur Originaldatei (wie in Fenster 7), die sich im TranscodedImageCache-Eintrag befindet.
Scott Bennett-McLeish
2

Wenn Sie in Windows 8 und 8.1 (und Berichten zufolge 10) Ihr Hintergrundbild in Windows Picture Viewer festgelegt haben (indem Sie ein Bild in Viewer öffnen und im Kontextmenü auf "Als Desktop-Hintergrund festlegen" klicken), wird dessen Speicherort angezeigt

%AppData%\Roaming\Microsoft\Windows Photo Viewer\Windows Photo Viewer Wallpaper.jpg
Artanis
quelle
1

In meiner Situation habe ich einen riesigen Ordner mit Bildern, die mein Hintergrundbild durchläuft. Einige langweilen mich nach einer Weile und ich möchte sie löschen, oder manchmal frage ich mich nur, wie der Bildname lautet, weil er die Beschreibung des Bildes enthalten kann.

Ich habe 2 Skripte basierend auf dem obigen Feedback erstellt - eines, um den aktuellen Bildpfad abzurufen, und eines, um ihn zu löschen. Nur unter Windows 10 getestet.

Holen Sie sich den Bildpfad (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');

Löschen Sie das Bild (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
quelle
1
  1. Gehe zu C:\Users\<USERNAME>\AppData\Roaming\Microsoft\Windows\Themes.
  2. Erstellen Sie eine Kopie von TranscodedWallpaper
  3. Benennen Sie die Kopie in um <NAME>.JPG

Getestet unter Windows 10

keinabel
quelle