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

2

Quando eu tinha o Windows 7, eu usava this thread para adicionar uma funcionalidade que me permite clicar com o botão direito do mouse 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 consegui adicionar a mesma funcionalidade usando a mesma técnica.

Eu naveguei no regedit para HKEY_CURRENT_USER\Control Panel\Desktop\Wallpaper , o que me fornece o seguinte caminho: C:\Users\UserName\AppData\Roaming\Microsoft\Windows\Themes\TranscodedWallpaper . Quando coloco este caminho no FileExplorer, ele me pede para abrir a imagem usando um dos meus editores / visualizadores de imagens. Quando faço isso, é a imagem correta, mas não é isso que estou procurando. Eu estou procurando o caminho da imagem real para que eu possa excluir a foto original. TranscodedWallpaper parece atualizar com cada alteração de fundo.

Eu sei que todos os planos de fundo são encontrados em D:\Users\MyUser\Pictures\Backgrounds (o Windows está na unidade C), mas existem cerca de 1.4k imagens, portanto, examiná-las toda vez que a imagem for muito problemática .

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

    
por Zach Saucier 17.12.2014 / 05:36

3 respostas

2

Embora esta seja agora uma questão antiga, achei que ainda valeria a pena fazer o seguinte post. Até recentemente, eu estava executando o Windows 7 e alguns anos atrás, como um exercício que tinha escrito um programa simples em execução com um ícone na bandeja do sistema para descobrir o caminho para a imagem de fundo atual da área de trabalho. Quando eu atualizei para o Windows 10, isso não funcionou mais, claro, então fui procurar e encontrei o blog de Ramesh Srinivasan e os roteiros de John Dangerbrooks. Como resultado, atualizei meu programa para trabalhar com o Windows 8 e além e trabalhar para diferentes imagens para ambientes de vários monitores, além de manter a compatibilidade retroativa com o Windows 7.

Estou compartilhando esse programa com a comunidade em geral, caso alguém mais goste da ideia de ter isso como uma ferramenta de 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, eu inicio automaticamente usando a chave HKEY_CURRENT_USER \ SOFTWARE \ Microsoft \ Windows \ CurrentVersion \ Run, mas deixo esse detalhe para você. Mais detalhes estão no readme.

Os arquivos zip estão localizados aqui link . (O antigo link link parece não funcionar mais - a Microsoft removeu a capacidade de gerar links curtos para pastas do OneDrive?)

    
por 24.11.2015 / 02:51
3

Encontrei um site que tem um script que você pode baixar e executar na sua máquina. Ele exibe um pop-up para o local e o nome da imagem em execução no plano de fundo. O motivo pelo qual você não consegue fazer com que o Windows 7 funcione é porque as informações são armazenadas de maneira diferente no Registro do Windows 8. No Windows 7, elas são em texto simples (inglês simples) e no Windows 8 são armazenadas 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

    
por 17.12.2014 / 08:28
1

O link que Reeves postou levou à criação de um arquivo .ps1 com este 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 alterar o ExecutionPolicy para permitir que o PS executasse arquivos .ps1.

No entanto, abrir o PS de cada vez e, em seguida, executar o comando era mais um incômodo do que eu queria, então eu leia esta postagem SO e fez um atalho na minha área de trabalho que tinha como alvo

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

Aqui está uma cópia do script usado no caso .ps1 em que o link fica inativo:

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;
}
    
por 17.12.2014 / 14:55