Вопрос: Найдите текущий фон рабочего стола 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 изображений, так что каждый раз просмотр их будет слишком сложным.

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


2
2017-12-17 04:36


Источник




Ответы:


Хотя теперь это старый вопрос, я подумал, что все равно стоит сделать следующий пост. До недавнего времени я работал под управлением 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.

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


2
2017-11-24 01:51



Вы знаете, как это можно изменить, чтобы обрабатывать несколько мониторов с разными фонами? - Zach Saucier
Программа должна работать на разных уровнях на нескольких мониторах. Тем не менее, существует ограничение на длину текста всплывающей подсказки на 63 символа, поэтому я решил отобразить только один путь изображения во всплывающей подсказке. Если вы щелкните правой кнопкой мыши по значку в системном трее, вы увидите пути изображения для каждого из ваших мониторов, отображаемых во всплывающем меню, и сможете выбрать один из них, чтобы другие пункты меню работали по выбранному пути изображения. Это не идеально, но я считаю это удобным. - Dunc


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





Связь что Ривз опубликовал привело к созданию .ps1 файл с этот скрипт внутри него. Запуск этого нового файла в Windows Power Shell открыл File Explorer, указав на фоновое изображение. Мне пришлось изменить 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;
}

1
2017-12-17 13:55