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

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.


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.

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


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

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)

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

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.