查找当前的 Windows 8 桌面背景

查找当前的 Windows 8 桌面背景

当我拥有 Windows 7 时,我使用此主题添加一项功能,让我可以右键单击桌面并单击以查找当前正在使用的背景。但是,自从更新到 Windows 8.1 以来,我一直无法使用相同的技术添加相同的功能。

我在 regedit 中导航到HKEY_CURRENT_USER\Control Panel\Desktop\Wallpaper,它给出了以下路径:C:\Users\UserName\AppData\Roaming\Microsoft\Windows\Themes\TranscodedWallpaper。当我将此路径输入 FileExplorer 时,它要求我使用我的一个图像编辑器/查看器打开图像。当我这样做时,它是正确的图像,但这不是我想要的。我正在寻找实际图像的文件路径,以便我可以删除原始照片。TranscodedWallpaper似乎随着每次背景变化而更新。

我确实知道所有的背景都在D:\Users\MyUser\Pictures\Backgrounds(Windows 位于 C 盘上),但是大约有 1.4k 张图像,因此每次查找图像时都要浏览它们,这实在是太麻烦了。

那么,如何将此功能重新添加到我的设置中?至少,如何获取当前背景图像的文件路径?

答案1

虽然这现在是一个老问题,但我认为仍然值得写以下帖子。直到最近,我还在运行 Windows 7,几年前,为了练习,我编写了一个使用系统托盘图标运行的简单程序,以发现当前桌面背景图像的路径。当我升级到 Windows 10 时,这当然不再起作用了,所以我去寻找并找到了 Ramesh Srinivasan 的博客和 John Dangerbrooks 的脚本。因此,我更新了我的程序以适用于 Windows 8 及更高版本,并适用于多显示器环境中的不同图像,同时还保持与 Windows 7 的向后兼容性。

我正在与更广泛的社区分享这个程序,以防其他人喜欢将其作为系统托盘工具的想法。它是用 C# 编写的,需要 .Net Framework v4,并且作为单独的 .zip 文件用于 x86(32 位)和 x64(64 位)环境。没有安装程序,它只是一个带有自述文件的简单可执行文件。我个人使用 HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Run 键自动启动它,但我把这个细节留给你。更多详细信息请参阅自述文件。

压缩文件位于此处https://onedrive.live.com/redir?resid=B2EA2CF6592EC937!839&authkey=!AMNZgrGbt9raflQ&ithint=folder%2czip. (旧的短链接http://1drv.ms/1OoQRti似乎不再起作用 - 微软是否删除了为 OneDrive 文件夹生成短链接的功能?)

答案2

我发现了一个网站,上面有一个脚本,你可以下载并在你的机器上运行,它会弹出一个窗口,显示背景上运行的图像的位置和名称。你无法让 Windows 7 调整工作的原因是因为信息在 Windows 8 中以不同的方式存储在注册表中。在 Windows 7 中,它是纯文本(纯英语),而在 Windows 8 中,它以原始二进制形式存储

01010100 01101000 01100101 00100000 01100001 01101110 01110011 01110111 01100101
01110010 01110011 00100000 01110100 01101111 00100000 01100001 01101100 01101100
00100000 01101111 01100110 00100000 01111001 01101111 01110101 01110010 00100000
01110001 01110101 01100101 01110011 01110100 01101001 01101111 01101110 01110011
00100000 01100001 01110010 01100101 00100000 01101111 01101110 00100000 01000111
01101111 01101111 01100111 01101100 01100101 00101110 01100011 01101111 01101101
00101110 00101110 00101110

您可以找到脚本这里

答案3

链接Reeves 发布的内容导致创建了一个.ps1文件这个脚本在 Windows Power Shell 中运行这个新文件确实打开了文件资源管理器并指向背景图像。我不得不更改ExecutionPolicy允许 PS 运行.ps1 文件。

但是,每次打开 PS 然后运行命令比我想要的更麻烦,所以我阅读此 SO 帖子并在我的桌面上创建了一个快捷方式,其目标是

powershell.exe -command "& 'C:\A path to the new ps1 file\MyScript.ps1'"

以下是 .ps1 链接中断时使用的脚本的副本:

Try 
{
  # Get script name
  $ScriptName=(Get-Item $PSCommandPath).Name

  # Load Windows Forms and initialize visual styles
  # Not needed for Windows 8. But I still don't know whether it is running on Windows 8.
  [void][System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms")
  [System.Windows.Forms.Application]::EnableVisualStyles()

  # Check Windows verison
  $vers=[System.Environment]::OSVersion.Version
  If (!(($vers.Major -eq 6) -and ($vers.Minor -ge 2) -and ($vers.Minor -le 3))) {
    $result=[System.Windows.Forms.MessageBox]::Show("This operating system is not supported. This script only supports Windows NT 6.2 or 6.3. (i.e. Windows 8, Windows Server 2012, Windows 8.1 or Windows Server 2012 R2). You seem to be running:`r`r"+[System.Environment]::OSVersion.VersionString, "Script", "OK", "Error");
    break;
  }

  # Initialize counters
  $Path_Start_Delta=24  #The offset at which the image path starts
  $Path_End_Delta=-1    #The offset at which the image path ends... is still unknown

  # First, access Windows Registry and get the property containing wallpaper path
  try {
    $TranscodedImageCache=(Get-ItemProperty 'HKCU:\Control Panel\Desktop' TranscodedImageCache -ErrorAction Stop).TranscodedImageCache
  }
  catch [System.Management.Automation.ItemNotFoundException],[System.Management.Automation.PSArgumentException]  {
    $result=[System.Windows.Forms.MessageBox]::Show("Windows does not seem to be holding a record of a wallpaper at this time.`r`r"+$Error[0].Exception.Message,"Script","OK","Error");
    break;
  }

  # Decode the property containing the path
  # First, let's assume the path ends at the last byte of $TranscodedImageCache
  $Path_End_Delta=$TranscodedImageCache.length-1

  # A sequence of 0x00 0x00 marks the end of string. Find it.
  # The array that we are searching contains a UTF-16 string. Each character is a little-endian WORD,
  # so we can search the array's even indexes only.
  for ($i = $Path_Start_Delta; $i -lt ($TranscodedImageCache.length); $i += 2) {
    if ($TranscodedImageCache[($i+2)..($i+3)] -eq 0) {
      $Path_End_Delta=$i + 1;
      Break;
    }
  }

  # Convert the bytes holding the wallpaper path to a Unicode string
  $UnicodeObject=New-Object System.Text.UnicodeEncoding
  $WallpaperSource=$UnicodeObject.GetString($TranscodedImageCache[$Path_Start_Delta..$Path_End_Delta]);


  # Test item's existence
  Get-Item $WallpaperSource -Force -ErrorAction Stop | Out-Null


  # Wallpaper should by now have been found.
  # Present it to the user. If he so chooses, launch Explorer to take him were wallpaper is.
  $result=[System.Windows.Forms.MessageBox]::Show("Wallpaper location: `r$WallpaperSource`r`rLaunch Explorer?", "Script", "YesNo", "Asterisk");
  if ($result -eq "Yes")
  {
      Start-Process explorer.exe -ArgumentList "/select,`"$WallpaperSource`""
  }
}
Catch
{
  $result=[System.Windows.Forms.MessageBox]::Show("Error!`r`r"+$Error[0], "Script", "OK", "Error");
  break;
}

相关内容