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

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.


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.

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.


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

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)

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

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.