Mesmo que você esteja configurando a entrada do Registro corretamente, a alteração não entrará em vigor porque a notificação "configuração alterada" apropriada não será enviada. A abordagem rundll32
, embora comumente recomendada, é incorreta e funciona apenas por acaso. Para obter mais informações, consulte Em que circunstâncias posso usar o rundll32 para invocar uma função em uma DLL?
A maneira correta de alterar a cor do plano de fundo da área de trabalho é usar o SetSysColors
, que coloca suas configurações em prática imediatamente. Ele não atualiza o Registro, mas isso não importa muito, já que o seu parece ter se surpreendido toda vez que você faz logon. Infelizmente, é um método nativo, não exposto em nenhum utilitário de linha de comando conveniente. Para chamá-lo, podemos usar o PowerShell! Primeiro definimos um tipo:
add-type -typedefinition "using System;'n using System.Runtime.InteropServices;'n public class PInvoke { [DllImport('"user32.dll'")] public static extern bool SetSysColors(int cElements, int[] lpaElements, int[] lpaRgbValues); }"
(P / Invoke definição cortesia de esta questão Stack Overflow .) Então podemos chamá-lo:
[PInvoke]::SetSysColors(1, @(1), @(0xAA40C0))
Depois de executar isso, a área de trabalho fica bastante rosa. A cor é determinada pelo último argumento, 0xAA40C0
no meu exemplo. O byte mais significativo dos três ( AA
) é azul, o próximo é verde e o último é vermelho. A notação @
cria uma matriz, que é o que a função espera.
Para fazer tudo isso a partir de um script em lote, use este verso:
powershell -command add-type -typedefinition """"using System;'n using System.Runtime.InteropServices;'n public class PInvoke { [DllImport('"""user32.dll'""")] public static extern bool SetSysColors(int cElements, int[] lpaElements, int[] lpaRgbValues); }""""; [PInvoke]::SetSysColors(1, @(1), @(0xAA40C0))