Como altero o álbum de apresentação de slides do papel de parede programaticamente?

7

O sistema operacional que estou usando é o Windows 10. Eu gostaria de alterar o álbum para o papel de parede e slideshow da tela de bloqueio usando um script ou outro meio programático. Analisei a alteração de regedit configurações, mas não consegui encontrar nada em regedit que referenciou diretamente o diretório de álbuns.

Até agora, olhei para HKEY_CURRENT_USER\Control Panel\Desktop e descobri que a imagem de papel de parede atual está armazenada em %APPDATA%\Microsoft\Windows\Themes\TranscodedWallpaper e os elementos da apresentação de slides estão codificados em slideshow.ini , que é um arquivo oculto nesse diretório.

Mais uma vez, gostaria de encontrar uma maneira de alterar isso programaticamente.

    
por Ricky Barillas 30.11.2015 / 23:41

1 resposta

2

Então ... estou usando o Windows 7. Por enquanto, o seguinte parece estar funcionando para mim:

Primeiro, você deseja configurar a apresentação de slides como quiser e, em seguida, salvar um backup do arquivo

%USERPROFILE%\AppData\Roaming\Microsoft\Windows\Themes\slideshow.ini

Tanto quanto eu posso dizer, isso codifica o caminho da pasta do álbum. Pode haver uma maneira de construir o seu próprio, mas neste momento eu não sei.

Estou usando o powershell. Meu powershell faz o seguinte:

Defina uma função para definir o papel de parede com base no código aqui :

Add-Type @"
using System;
using System.Runtime.InteropServices;
using Microsoft.Win32;
namespace Wallpaper {

   public class Setter {
      public const int SetDesktopWallpaper = 20;
      public const int UpdateIniFile = 0x01;
      public const int SendWinIniChange = 0x02;

      [DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)]
      private static extern int SystemParametersInfo (int uAction, int uParam, string lpvPara, int fuWinIni);

      public static void SetWallpaper (string path) {

         SystemParametersInfo(SetDesktopWallpaper, 0, path, UpdateIniFile | SendWinIniChange);

         RegistryKey key = Registry.CurrentUser.OpenSubKey("Control Panel\Desktop", true);

         //"Fit" style
         key.SetValue(@"WallpaperStyle", "6");
         key.SetValue(@"TileWallpaper", "0");

         key.Close();
      }
   }
}
"@

[Wallpaper.Setter]::SetWallpaper("C:\My\Cool\Pics\monkey.jpg")

O código total é provavelmente muito longo, mas a essência é a seguinte:

Definir papel de parede da imagem para apresentação de slides

  1. Defina o caminho do papel de parede para "" usando a função acima
  2. Copie o arquivo slideshow.ini do backup de volta para esse diretório
  3. Stop-process -name explorer
  4. Dormir 1 segundo e iniciar o explorador somente se não tiver reiniciado automaticamente

Definir papel de parede de apresentação de slides para imagem única

  1. Exclua os dois arquivos a seguir, se existirem:
    ~\AppData\Roaming\Microsoft\Windows\Themes\slideshow.ini
    ~\AppData\Roaming\Microsoft\Windows\Themes\TranscodedImage.jpg
  1. Defina o caminho do papel de parede usando a função acima
  2. Stop-process -name explorer
  3. Dormir 1 segundo e iniciar o explorador somente se não tiver reiniciado automaticamente

Com relação à codificação do arquivo slideshow.ini : de acordo com esta conversa no fórum , o campo codificado é uma" estrutura PCIDLIST_ABSOLUTE uuencoded ". Eu não olhei para isso, mas talvez alguém possa descobrir como criá-los.

Sobre matar o explorador. Leva alguns segundos na minha máquina para o explorador iniciar a apresentação de slides após a reinicialização, mas, até onde eu sei, ela parece funcionar consistentemente. Eu tentei várias alternativas, mas não consegui descobrir uma maneira mais limpa de atualizar a área de trabalho e obter as novas configurações. Eu posso ver no procmon SysInternals quando explorer.exe lê algumas das entradas do Registro relevantes. Parece que é durante o ish ou after-ish inicializando a bandeja do sistema.

Eu não sei o quão ruim matar o explorador é para o seu sistema. Talvez seja muito ruim? Se você encontrar uma maneira melhor, por favor, compartilhe. :)

    
por 27.08.2017 / 04:46

Tags