ฉันจะหาเส้นทางไปยังภาพบนเดสก์ท็อปปัจจุบันสำหรับ Windows 8 ได้อย่างไร


10

เมื่ออัปเกรดเป็น Windows 8 เมื่อเร็ว ๆ นี้สคริปต์ของฉันเพื่อดึงภาพพื้นหลังเดสก์ท็อปปัจจุบันเสียหาย

สำหรับ Windows 7 ฉันจะค้นหาเส้นทางไปยังภาพบนเดสก์ท็อปปัจจุบันได้อย่างไร นี้ใช้งานได้ดี อย่างไรก็ตามคีย์รีจิสทรีดังกล่าวจะมีอยู่เสมอ

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

รีจิสตรีคีย์ใหม่สำหรับ Windows 8 คืออะไร

ฉันพบวิธีแก้ปัญหาที่เป็นไปได้สองข้อแล้ว

ประการแรกคีย์นี้มีสิ่งที่ดูเหมือนเส้นทางที่เข้ารหัส Base64:

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

จากนั้นมี "ไฟล์คุณสมบัติของธีมที่กำหนดเอง" ซึ่งมีส่วน "[SlideShow]" ซึ่งดูเหมือน Base64:

C:\Users\Scott\AppData\Local\Microsoft\Windows\Themes\Custom.theme

ฉันสนใจในรายการรีจิสตรีที่เข้ารหัสด้วย base64 ที่ดูเหมือนว่าจะเห็นได้ชัด เหตุใด Microsoft จะเข้ารหัสพวกเขาเช่นนั้น สิ่งที่จะได้รับจากการซ่อนข้อมูลพื้นฐานนั้น
Synetech

คำตอบ:


10

รีจิสตรีคีย์สองตัวด้านล่างเก็บเส้นทางเดิมของภาพพื้นหลังปัจจุบัน:

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

พวกเขาอยู่ในรูปแบบ Unicode เมื่อถอดรหัสแล้วจะมีเส้นทางเต็มไปยังภาพพื้นหลังปัจจุบัน


2
เพียงแค่การชี้แจงสำหรับทุกคนที่ยุ่งกับสิ่งนี้: ค่ามีข้อมูลที่ไม่ใช่สตริงใน 24 ไบต์แรกและข้อมูลที่เหลือคือ Unicode เข้ารหัสสตริงที่สิ้นสุดด้วยค่า null (\ 0) มีความสุขในการแยกวิเคราะห์
นาธานเทย์เลอร์

ใน PowerShell มันคือ[System.Text.Encoding]::Unicode.GetString($bytes[24..($bytes.length-1)])สมมติว่า$bytesมีค่าของคีย์
NextInLine

2
powerhell twoliner เต็มรูปแบบ:$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]
มาร์ค Harviston

3
  1. ไปที่คำสั่งเรียกใช้ Windows (WinLogo + R)
  2. พิมพ์:% AppData%
  3. ในโฟลเดอร์ 'Roaming' ไปที่ 'Microsoft' จากนั้น 'Windwows' จากนั้น 'Themes' และสุดท้าย 'CachedFiles'
  4. คัดลอกไฟล์ภาพพื้นหลัง

ตรงไปตรงมาและรวดเร็ว ฉันคว้าไฟล์เปลี่ยนนามสกุลเป็น. jpg และตามนั้น
valsidalv

2

ตรวจสอบค่าHKEY_CURRENT_USER\Control Panel\Desktop\WallpaperREG_SZ (สตริง) สิ่งนี้จะแสดงเส้นทางไปสู่ ​​TranscodedWallpaper.jpg ที่ใช้อยู่ในปัจจุบัน


ขอบคุณ! นั่นชี้ให้ฉันไปที่ตำแหน่งรีจิสทรีที่ถูกต้องอย่างน้อย ฉันไม่เพียง แต่ต้องการวอลเปเปอร์ปัจจุบัน แต่เส้นทางไปยังไฟล์ต้นฉบับ (เช่นเดียวกับ Window 7 ได้) ซึ่งอยู่ในรายการ TranscodedImageCache
Scott Bennett-McLeish


2

ใน Windows 8 และ 8.1 (และมีรายงานว่า 10) ถ้าคุณได้ตั้งค่ารูปพื้นหลังของคุณจาก Windows Picture Viewer (โดยการเปิดรูปภาพใน Viewer และคลิก "Set as desktop wallpaper" ในเมนูบริบท) ตำแหน่งของมันจะเป็น

%AppData%\Roaming\Microsoft\Windows Photo Viewer\Windows Photo Viewer Wallpaper.jpg

1

ในสถานการณ์ของฉันฉันมีโฟลเดอร์ขนาดใหญ่ของภาพที่วอลล์เปเปอร์ของฉันผ่านรอบ ฉันเบื่อบางคนหลังจากที่สักครู่และต้องการลบพวกเขาหรือบางครั้งฉันก็สงสัยว่าชื่อภาพคืออะไรเพราะมันสามารถมีคำอธิบายของภาพ

ฉันสร้างสคริปต์ 2 ตัวตามข้อเสนอแนะด้านบน - รายการหนึ่งเพื่อรับเส้นทางรูปภาพปัจจุบันและอีกบทหนึ่งเพื่อลบ ทดสอบบน Windows 10 เท่านั้น

รับเส้นทางรูปภาพ (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');

ลบภาพ (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. C:\Users\<USERNAME>\AppData\Roaming\Microsoft\Windows\Themesไปที่
  2. สร้างสำเนาของ TranscodedWallpaper
  3. เปลี่ยนชื่อสำเนาเป็น <NAME>.JPG

ทดสอบบน Windows 10

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.