Bagaimana saya bisa mengetahui jalur ke gambar desktop saat ini, untuk Windows 8

10

Baru-baru ini ditingkatkan ke Windows 8, skrip saya untuk mengambil gambar wallpaper desktop saat ini telah rusak.

Untuk Windows 7, Bagaimana saya bisa mengetahui jalur ke gambar desktop saat ini? , ini bekerja dengan baik. Namun, kunci registri itu sekarang selalu berisi

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

Apa kunci registri baru yang digunakan untuk Windows 8?

Saya telah menemukan dua solusi yang mungkin.

Pertama, kunci ini berisi apa yang tampak seperti jalur yang disandikan Base64:

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

Dan kemudian ada "file properti tema kustom" yang juga berisi bagian "[SlideShow]" yang terlihat seperti Base64:

C:\Users\Scott\AppData\Local\Microsoft\Windows\Themes\Custom.theme
Scott Bennett-McLeish
sumber
Saya tertarik dengan entri registri yang tampaknya dikodekan (tetapi tampaknya tidak). Mengapa Microsoft menyandikan mereka seperti itu? Apa untungnya menyembunyikan informasi dasar itu?
Synetech

Jawaban:

10

Dua kunci registri di bawah keduanya menyimpan jalur asli gambar wallpaper saat ini:

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

Mereka dalam format Unicode, setelah decoding itu, orang akan memiliki path lengkap ke gambar wallpaper saat ini.

Scott Bennett-McLeish
sumber
2
Hanya klarifikasi untuk siapa saja yang bermain-main dengan ini: nilainya berisi data non-string dalam 24 byte pertama, dan data yang tersisa adalah string Unicode yang dikodekan, null-terminated (\ 0). Selamat parsing.
Nathan Taylor
Dalam powershell, itu [System.Text.Encoding]::Unicode.GetString($bytes[24..($bytes.length-1)]), anggap $bytesberisi nilai kunci
NextInLine
2
twoliner penuh 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. Pergi ke Windows Run Command (WinLogo + R)
  2. Ketikkan:% AppData%
  3. Di folder 'Roaming', buka 'Microsoft', lalu 'Windwows', lalu 'Themes', dan terakhir 'CachedFiles'
  4. Salin file wallpaper.
Gilbert
sumber
Ini sangat mudah dan cepat. Saya mengambil file itu, mengubah ekstensi menjadi .jpg dan itu dia.
valsidalv
2

Periksa nilai HKEY_CURRENT_USER\Control Panel\Desktop\WallpaperREG_SZ (string). Ini akan menunjukkan kepada Anda jalan menuju TranscodedWallpaper.jpg yang sedang digunakan.

Karan
sumber
Terima kasih! Itu menunjuk saya ke lokasi registri yang benar setidaknya. Saya tidak hanya ingin wallpaper saat ini tetapi path ke file asli (seperti Window 7 lakukan), yang ada di entri TranscodedImageCache.
Scott Bennett-McLeish
2

Di Windows 8 dan 8.1 (dan, kabarnya, 10), jika Anda telah mengatur wallpaper dari Windows Picture Viewer (dengan membuka gambar di Viewer dan mengklik "Set as desktop wallpaper" di menu konteks), lokasinya akan menjadi

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

Dalam situasi saya, saya memiliki folder besar gambar yang siklus wallpaper saya melalui. Saya bosan beberapa setelah beberapa saat dan ingin menghapusnya atau kadang-kadang saya hanya bertanya-tanya apa nama gambar karena dapat memiliki deskripsi gambar.

Saya membuat 2 skrip berdasarkan umpan balik di atas - satu untuk mendapatkan jalur gambar saat ini dan satu untuk menghapusnya. Hanya menguji ini pada Windows 10.

Dapatkan jalur gambar (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');

Hapus gambar (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
sumber
1
  1. Pergi ke C:\Users\<USERNAME>\AppData\Roaming\Microsoft\Windows\Themes.
  2. Buat salinan TranscodedWallpaper
  3. Ubah nama salinan menjadi <NAME>.JPG

Diuji pada Windows 10

keinabel
sumber