2

Когда у меня была 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,4 тыс. Изображений, поэтому каждый раз просматривать их будет слишком сложно. много хлопот.

Итак, как я могу добавить эту функцию обратно в мои настройки? Как минимум, как я могу получить путь к файлу текущего фонового изображения?

3 ответа3

3

Я нашел веб-сайт, на котором есть скрипт, который вы можете загрузить и запустить на своем компьютере. Он дает вам всплывающее окно с названием и названием изображения на вашем фоне. Причина, по которой вы не можете настроить свой 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

Вы можете найти скрипт здесь

2

Хотя это уже старый вопрос, я подумал, что все же стоит сделать следующий пост. До недавнего времени я работал под управлением Windows 7, а несколько лет назад в качестве упражнения написал простую программу со значком в системном трее, чтобы определить путь к текущему фоновому изображению рабочего стола. Когда я обновился до Windows 10, это, конечно, больше не работало, поэтому я отправился на поиски и нашел блог Рамеша Шринивасана и сценарии Джона Дангербрукса. В результате я обновил свою программу для работы в Windows 8 и более поздних версиях, а также для работы с различными образами в средах с несколькими мониторами, а также сохранил обратную совместимость с Windows 7.

Я делюсь этой программой с широким сообществом на тот случай, если кому-то еще понравится идея использовать ее в качестве инструмента в системном трее. Он написан на C # и требует .Net Framework v4 и доступен в виде отдельных файлов .zip для сред x86 (32-разрядная) и x64 (64-разрядная). Там нет установщика, это просто простой исполняемый файл с файлом readme. Лично я запускаю его автоматически, используя ключ HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Run, но оставляю эту деталь вам. Более подробная информация в readme.

ZIP-файлы находятся здесь https://onedrive.live.com/redir?resid=B2EA2CF6592EC937!839&authkey=!AMNZgrGbt9raflQ&ithint=folder%2czip. (Старая короткая ссылка http://1drv.ms/1OoQRti, похоже, больше не работает - удалила ли Microsoft возможность создавать короткие ссылки для папок OneDrive?)

1

Ссылка, которую опубликовал Ривз, привела к созданию файла .ps1 с этим скриптом внутри. При запуске этого нового файла в Windows Power Shell открылся проводник, указывающий на фоновое изображение. Мне пришлось изменить ExecutionPolicy чтобы PS запускал файлы .ps1.

Однако каждый раз открывать PS, а затем запускать команду, доставляло больше хлопот, чем я хотел, поэтому я прочитал этот пост и сделал ярлык на своем рабочем столе с целью

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;
}

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .