Comment puis-je trouver le chemin d'accès à l'image de bureau actuelle, pour Windows 8

10

Ayant récemment mis à niveau vers Windows 8, mon script pour récupérer l'image actuelle du fond d'écran est cassé.

Pour Windows 7, comment puis-je trouver le chemin d'accès à l'image de bureau actuelle? , cela fonctionne très bien. Cependant, cette clé de registre contient désormais toujours

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

Quelle est la nouvelle clé de registre utilisée pour Windows 8?

J'ai trouvé deux solutions possibles.

Tout d'abord, cette clé contient ce qui ressemble à un chemin codé en Base64:

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

Et puis il y a le "fichier de propriétés de thème personnalisé" qui contient également une section "[SlideShow]" qui ressemble à Base64:

C:\Users\Scott\AppData\Local\Microsoft\Windows\Themes\Custom.theme
Scott Bennett-McLeish
la source
Je suis intéressé par les entrées de registre encodées en base64 (mais apparemment pas). Pourquoi Microsoft les coderait-il comme ça? Que gagner à cacher ces informations de base?
Synetech

Réponses:

10

Les deux clés de registre ci-dessous stockent toutes deux le chemin d'origine de l'image de fond d'écran actuelle:

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

Ils sont au format Unicode, après décodage, on aura le chemin complet vers l'image de fond d'écran actuelle.

Scott Bennett-McLeish
la source
2
Juste une clarification pour quiconque déconseille ceci: la valeur contient des données non-chaîne dans les 24 premiers octets, et les données restantes sont une chaîne codée Unicode, terminée par un caractère nul (\ 0). Bonne analyse.
Nathan Taylor
Dans PowerShell, c'est [System.Text.Encoding]::Unicode.GetString($bytes[24..($bytes.length-1)]), en supposant que $bytescontient la valeur de la clé
NextInLine
2
PowerShell Twoliner complet:$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. Accédez à Windows Run Command (WinLogo + R)
  2. Tapez:% AppData%
  3. Dans le dossier «Roaming», allez dans «Microsoft», puis «Windwows», puis «Themes» et enfin «CachedFiles»
  4. Copiez le fichier papier peint.
Gilbert
la source
C'est tellement simple et rapide. J'ai attrapé le fichier, changé l'extension en .jpg et le voilà.
valsidalv
2

Vérifiez la valeur HKEY_CURRENT_USER\Control Panel\Desktop\WallpaperREG_SZ (chaîne). Cela vous montrera le chemin vers le TranscodedWallpaper.jpg actuellement utilisé.

Karan
la source
Je vous remercie! Cela m'a indiqué au moins l'emplacement correct du registre. Je voulais non seulement le fond d'écran actuel, mais le chemin d'accès au fichier d'origine (comme Windows 7 l'a fait), qui se trouve dans l'entrée TranscodedImageCache.
Scott Bennett-McLeish
2

Dans Windows 8 et 8.1 (et, semble-t-il, 10), si vous avez défini votre fond d'écran à partir de Windows Picture Viewer (en ouvrant une image dans Viewer et en cliquant sur "Définir comme fond d'écran" dans le menu contextuel), son emplacement sera

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

Dans ma situation, j'ai un énorme dossier d'images que mon fond d'écran parcourt. Je m'ennuie de certains après un certain temps et je veux les supprimer ou parfois je me demande simplement quel est le nom de l'image car elle peut avoir la description de l'image.

J'ai construit 2 scripts basés sur les commentaires ci-dessus - un pour obtenir le chemin de l'image actuelle et un pour le supprimer. Testé uniquement sur Windows 10.

Obtenez le chemin de l'image (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');

Supprimer l'image (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
la source
1
  1. Allez à C:\Users\<USERNAME>\AppData\Roaming\Microsoft\Windows\Themes.
  2. Créer une copie de TranscodedWallpaper
  3. Renommez la copie en <NAME>.JPG

Testé sur Windows 10

keinabel
la source