Como descobrir o caminho para a imagem da área de trabalho atual, para Windows 8

10

Tendo atualizado recentemente para o Windows 8, meu script para recuperar a imagem atual do papel de parede da área de trabalho foi quebrado.

No Windows 7, como descobrir o caminho para a imagem da área de trabalho atual? , isso funciona muito bem. No entanto, essa chave do registro agora sempre contém

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

Qual é a nova chave do Registro usada no Windows 8?

Eu encontrei duas soluções possíveis.

Primeiramente, essa chave contém o que parece um caminho codificado em Base64:

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

E existe o "arquivo de propriedades do tema personalizado", que também contém uma seção "[SlideShow]" que se parece com Base64:

C:\Users\Scott\AppData\Local\Microsoft\Windows\Themes\Custom.theme
Scott Bennett-McLeish
fonte
Estou interessado nas entradas de registro aparentemente (mas aparentemente não) codificadas em base64. Por que a Microsoft os codificaria assim? O que ganhar com a ocultação dessas informações básicas?
Synetech

Respostas:

10

As duas chaves do registro abaixo armazenam o caminho original da imagem de papel de parede atual:

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

Eles estão no formato Unicode, ao decodificar isso, um terá o caminho completo para a imagem atual do papel de parede.

Scott Bennett-McLeish
fonte
2
Apenas um esclarecimento para qualquer um que brinque com isso: o valor contém dados que não são de cadeia nos primeiros 24 bytes e os dados restantes são uma cadeia de caracteres com codificação Unicode e terminação nula (\ 0). Análise feliz.
Nathan Taylor
No PowerShell, é [System.Text.Encoding]::Unicode.GetString($bytes[24..($bytes.length-1)]), assumindo que $bytescontenha o valor da chave
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 10/10
3
  1. Vá para o comando Executar do Windows (WinLogo + R)
  2. Digite:% AppData%
  3. Na pasta 'Roaming', vá para 'Microsoft', 'Windwows', depois 'Temas' e, por fim, 'CachedFiles'
  4. Copie o arquivo de papel de parede.
Gilbert
fonte
Isso é tão simples e rápido. Peguei o arquivo, alterei a extensão para .jpg e lá estava.
valsidalv
2

Verifique o valor HKEY_CURRENT_USER\Control Panel\Desktop\WallpaperREG_SZ (string). Isso mostrará o caminho para o TranscodedWallpaper.jpg atualmente em uso.

Karan
fonte
Obrigado! Isso me indicou pelo menos o local correto do registro. Eu não queria apenas o papel de parede atual, mas o caminho para o arquivo original (como o Windows 7), que está na entrada TranscodedImageCache.
22412 Scott Scott-Bennett-McLeish
2

No Windows 8 e 8.1 (e, supostamente, 10), se você definiu seu papel de parede no Windows Picture Viewer (abrindo uma imagem no Viewer e clicando em "Definir como papel de parede da área de trabalho" no menu de contexto), sua localização será

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

Na minha situação, tenho uma enorme pasta de imagens que meu papel de parede percorre. Fico entediado com alguns depois de um tempo e quero excluí-los ou, às vezes, fico imaginando qual é o nome da imagem porque ela pode ter a descrição da imagem.

Criei 2 scripts com base nos comentários acima - um para obter o caminho da imagem atual e outro para excluí-lo. Só testei isso no Windows 10.

Obter o caminho da imagem (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');

Excluir a imagem (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
fonte
1
  1. Vá para C:\Users\<USERNAME>\AppData\Roaming\Microsoft\Windows\Themes.
  2. Crie uma cópia de TranscodedWallpaper
  3. Renomeie a cópia para <NAME>.JPG

Testado no Windows 10

keinabel
fonte