¿Cómo podría encontrar la ruta a la imagen de escritorio actual para Windows 8?

10

Habiendo actualizado recientemente a Windows 8, mi secuencia de comandos para recuperar la imagen de fondo de escritorio actual se ha roto.

Para Windows 7, ¿cómo podría encontrar la ruta a la imagen de escritorio actual? , esto funciona muy bien. Sin embargo, esa clave de registro ahora siempre contiene

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

¿Cuál es la nueva clave de registro utilizada para Windows 8?

He encontrado dos posibles soluciones.

En primer lugar, esta clave contiene lo que parece una ruta codificada en Base64:

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

Y luego está el "archivo de propiedades de tema personalizado" que también contiene una sección "[SlideShow]" que se parece a Base64:

C:\Users\Scott\AppData\Local\Microsoft\Windows\Themes\Custom.theme
Scott Bennett-McLeish
fuente
Estoy interesado en las entradas de registro aparentemente (pero aparentemente no) codificadas en base64. ¿Por qué Microsoft los codificaría así? ¿Qué se gana escondiendo esa información básica?
Synetech

Respuestas:

10

Las dos claves de registro a continuación almacenan la ruta original de la imagen de fondo actual:

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

Están en formato Unicode, al decodificar eso, uno tendrá la ruta completa a la imagen de fondo de pantalla actual.

Scott Bennett-McLeish
fuente
2
Solo una aclaración para cualquiera que esté jugando con esto: el valor contiene datos que no son de cadena en los primeros 24 bytes, y los datos restantes son una cadena codificada en Unicode, terminada en nulo (\ 0). Feliz análisis.
Nathan Taylor
En powershell, es [System.Text.Encoding]::Unicode.GetString($bytes[24..($bytes.length-1)]), suponiendo que $bytescontiene el valor de la clave
NextInLine
2
Powershell twoliner completo:$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. Vaya al comando Ejecutar de Windows (WinLogo + R)
  2. Escriba:% AppData%
  3. En la carpeta 'Roaming', vaya a 'Microsoft', luego 'Windwows', luego 'Temas' y finalmente 'CachedFiles'
  4. Copie el archivo de fondo de pantalla.
Gilbert
fuente
Esto es muy sencillo y rápido. Tomé el archivo, cambié la extensión a .jpg y ahí estaba.
valsidalv
2

Verifique el valor HKEY_CURRENT_USER\Control Panel\Desktop\WallpaperREG_SZ (cadena). Esto le mostrará la ruta al TranscodedWallpaper.jpg actualmente en uso.

Karan
fuente
¡Gracias! Eso me señaló la ubicación correcta del registro al menos. No solo quería el fondo de pantalla actual, sino también la ruta al archivo original (como lo hizo Windows 7), que está en la entrada TranscodedImageCache.
Scott Bennett-McLeish
2

En Windows 8 y 8.1 (y, según se informa, 10), si ha configurado su fondo de pantalla desde Windows Picture Viewer (abriendo una imagen en Viewer y haciendo clic en "Establecer como fondo de escritorio" en el menú contextual), su ubicación será

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

En mi situación, tengo una enorme carpeta de imágenes a través de las cuales mi fondo de pantalla pasa. Me aburro de algunos después de un tiempo y quiero eliminarlos o, a veces, me pregunto cuál es el nombre de la imagen porque puede tener la descripción de la imagen.

Creé 2 scripts basados ​​en los comentarios anteriores, uno para obtener la ruta de la imagen actual y otro para eliminarlo. Solo probé esto en Windows 10.

Obtenga la ruta de la imagen (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');

Eliminar la imagen (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
fuente
1
  1. Ir a C:\Users\<USERNAME>\AppData\Roaming\Microsoft\Windows\Themes.
  2. Crea una copia de TranscodedWallpaper
  3. Cambiar el nombre de la copia a <NAME>.JPG

Probado en Windows 10

keinabel
fuente