Encontre o plano de fundo da área de trabalho atual do Windows 8

2

Quando eu tinha o Windows 7, usei esse segmento para adicionar uma funcionalidade que me permite clicar com o botão direito na área de trabalho e clicar para encontrar o plano de fundo que está sendo usado no momento. No entanto, desde a atualização para o Windows 8.1, não consigo adicionar a mesma funcionalidade usando a mesma técnica.

Eu tenho navegado em regedit para HKEY_CURRENT_USER\Control Panel\Desktop\Wallpaper, o que me dá o seguinte caminho: C:\Users\UserName\AppData\Roaming\Microsoft\Windows\Themes\TranscodedWallpaper. Quando coloco esse caminho no FileExplorer, ele solicita que eu abra a imagem usando um dos meus editores / visualizadores de imagens. Quando eu faço, é a imagem correta, mas não é isso que estou procurando. Estou procurando o caminho do arquivo da imagem real para poder excluir a foto original. TranscodedWallpaperparece atualizar a cada alteração de fundo.

Eu sei que todos os planos de fundo são encontrados D:\Users\MyUser\Pictures\Backgrounds(o Windows está na unidade C), mas existem cerca de 1,4 mil imagens; portanto, procurar por elas todas as vezes em busca da imagem seria um grande aborrecimento.

Então, como posso adicionar essa funcionalidade de volta à minha instalação? No mínimo, como posso obter o caminho do arquivo da imagem de plano de fundo atual?

Zach Saucier
fonte

Respostas:

2

Embora agora essa seja uma pergunta antiga, pensei que ainda valeria a pena fazer o seguinte post. Até recentemente, eu estava executando o Windows 7 e há alguns anos atrás, como um exercício, escrevia um programa simples executando um ícone da bandeja do sistema para descobrir o caminho para a imagem de plano de fundo da área de trabalho atual. Quando atualizei para o Windows 10, isso não funcionou mais, é claro, então procurei e encontrei o blog de Ramesh Srinivasan e os scripts de John Dangerbrooks. Como resultado, atualizei meu programa para trabalhar com o Windows 8 e posteriores e com imagens diferentes para ambientes com vários monitores, além de manter a compatibilidade com o Windows 7.

Estou compartilhando este programa com a comunidade em geral, caso alguém goste da ideia de tê-lo como uma ferramenta da bandeja do sistema. Ele é escrito em C # e requer o .Net framework v4 e está disponível como arquivos .zip separados para ambientes x86 (32 bits) e x64 (64 bits). Não há instalador, é apenas um executável simples com um arquivo leia-me. Pessoalmente, inicio-o automaticamente usando a chave HKEY_CURRENT_USER \ SOFTWARE \ Microsoft \ Windows \ CurrentVersion \ Run, mas deixo esses detalhes para você. Mais detalhes estão no leia-me.

Os arquivos zip estão localizados aqui https://onedrive.live.com/redir?resid=B2EA2CF6592EC937!839&authkey=!AMNZgrGbt9raflQ&ithint=folder%2czip . (O link curto antigo http://1drv.ms/1OoQRti parece não funcionar mais - a Microsoft removeu a capacidade de gerar links curtos para pastas do OneDrive?)

Dunc
fonte
Você tem alguma idéia de como isso pode ser modificado para lidar com vários monitores com diferentes origens?
Zach Saucier
11
O programa deve funcionar para diferentes origens em vários monitores. No entanto, há uma restrição no comprimento do texto da dica de ferramenta de 63 caracteres, então optei por exibir apenas um caminho de imagem na dica de ferramenta. Se, no entanto, você clicar com o botão direito do mouse no ícone da bandeja do sistema, deverá ver os caminhos da imagem de cada um dos monitores exibidos no menu pop-up e poderá selecionar um deles para que os outros itens do menu operem no caminho da imagem selecionada. Não é perfeito, mas acho útil.
Dunc
3

Eu encontrei um site que possui um script que você pode baixar e executar na sua máquina; ele fornece um pop-up para o local e o nome da imagem em execução no seu plano de fundo. O motivo pelo qual você não consegue fazer o tweak do Windows 7 funcionar é porque as informações são armazenadas de maneira diferente no registro do Windows 8. No Windows 7, ele está em texto sem formatação (em inglês) e no Windows 8, armazenado em binário bruto

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

Você pode encontrar o script aqui

Andrew
fonte
1

O link que Reeves postou levou à criação de um .ps1arquivo com esse script dentro dele. A execução desse novo arquivo no Windows Power Shell abriu o Gerenciador de Arquivos, apontando para a imagem de plano de fundo. Eu tive que mudar o ExecutionPolicypara permitir que o PS execute arquivos .ps1.

No entanto, abrir o PS toda vez e depois executar o comando era mais complicado do que eu queria, então li esta postagem do SO e fiz um atalho na área de trabalho que tinha como objetivo

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

Aqui está uma cópia do script usado no caso .ps1, o link é desativado:

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;
}
Zach Saucier
fonte