Windows 8の場合、どのようにして現在のデスクトップイメージへのパスを見つけることができますか


10

最近Windows 8にアップグレードしたため、現在のデスクトップの壁紙画像を取得するためのスクリプトが壊れています。

Windows 7の場合、現在のデスクトップイメージへのパスを見つけるにどうすればよいですか?、これはうまくいきます。ただし、このレジストリキーには常に

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

Windows 8で使用される新しいレジストリキーは何ですか?

私は2つの可能な解決策を見つけました。

まず、このキーには、Base64でエンコードされたパスのようなものが含まれます。

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

そして、Base64のような「[SlideShow]」セクションも含む「カスタムテーマプロパティファイル」があります。

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

見かけ上は(しかしそうではないように)base64でエンコードされたレジストリエントリに興味があります。なぜマイクロソフトはそれらをそのようにエンコードするのですか?その基本的な情報を隠すことで何が得られますか?
Synetech 2017年

回答:


10

以下の2つのレジストリキーには、現在の壁紙画像の元のパスが格納されています。

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

それらはUnicode形式であり、それをデコードすると、現在の壁紙画像への完全パスが得られます。


2
これをいじり回している人のための説明です。値には最初の24バイトに非文字列データが含まれ、残りのデータはUnicodeエンコードされたnullで終了する(\ 0)文字列です。ハッピー解析。
Nathan Taylor

PowerShellでは、それはだ[System.Text.Encoding]::Unicode.GetString($bytes[24..($bytes.length-1)])と仮定すると、$bytesキーの値が含まれている
NextInLine

2
フルツーライナーパワーシェル:$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

3
  1. Windows実行コマンドに移動(WinLogo + R)
  2. 入力:%AppData%
  3. 「ローミング」フォルダで、「Microsoft」、「Windwows」、「Themes」、最後に「CachedFiles」に移動します
  4. 壁紙ファイルをコピーします。

これはとても簡単で迅速です。私はファイルをつかみ、拡張子を.jpgに変更しました。
valsidalv 2015年

2

HKEY_CURRENT_USER\Control Panel\Desktop\WallpaperREG_SZ(文字列)値を確認します。これにより、現在使用中のTranscodedWallpaper.jpgへのパスが表示されます。


ありがとうございました!これにより、少なくとも正しいレジストリの場所が示されました。現在の壁紙だけでなく、TranscodedImageCacheエントリにある元のファイル(Windows 7のように)へのパスも必要でした。
Scott Bennett-McLeish


2

Windows 8および8.1(および報告によると10)で、Windowsピクチャビューアーから壁紙を設定した場合(ビューアーで画像を開き、コンテキストメニューの[デスクトップの壁紙に設定]をクリックして)、その場所は

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

1

私の状況では、壁紙が循環する画像の巨大なフォルダがあります。しばらくすると退屈して削除したい場合があります。または、画像の説明が含まれている可能性があるため、画像の名前が何なのか疑問に思うことがあります。

上記のフィードバックに基づいて2つのスクリプトを作成しました。1つは現在の画像パスを取得するスクリプトで、もう1つは削除するスクリプトです。これは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.