How to set the Desktop Background via PowerShell
This article has not been completed yet. However, it may already contain helpful Information and therefore it has been published at this stage.
<#PSScriptInfo
.VERSION 1.0.0.0
.GUID 084a184a-faa1-47e4-9f1a-5d9ecede68c3
.AUTHOR Jeffrey Snover
.COMPANYNAME
.COPYRIGHT
.TAGS
.LICENSEURI
.PROJECTURI
.ICONURI
.EXTERNALMODULEDEPENDENCIES
.REQUIREDSCRIPTS
.EXTERNALSCRIPTDEPENDENCIES
.RELEASENOTES
#>
<#
.DESCRIPTION
Set the desktop background to an RGB color.
The core of this code was produced by http://stackoverflow.com/users/3281719/wheatfairies who
published it http://stackoverflow.com/questions/25774494/powershell-make-desktop-background-changes-take-effect-immediately
#>
param(
[Parameter(Position=0)]
$R=255,
[Parameter(Position=1)]
$G=255,
[Parameter(Position=2)]
$B=255
)
$code = @'
using System;
using System.Drawing;
using System.Runtime.InteropServices;
using Microsoft.Win32;
namespace CurrentUser
{
public class Desktop
{
[DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)]
private static extern int SystemParametersInfo(int uAction, int uParm, string lpvParam, int fuWinIni);
[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
private static extern int SetSysColors(int cElements, int[] lpaElements, int[] lpRgbValues);
public const int UpdateIniFile = 0x01;
public const int SendWinIniChange = 0x02;
public const int SetDesktopBackground = 0x0014;
public const int COLOR_DESKTOP = 1;
public int[] first = {COLOR_DESKTOP};
public static void RemoveWallPaper()
{
SystemParametersInfo( SetDesktopBackground, 0, "", SendWinIniChange | UpdateIniFile );
RegistryKey regkey = Registry.CurrentUser.OpenSubKey("Control Panel\\Desktop", true);
regkey.SetValue(@"WallPaper", 0);
regkey.Close();
}
public static void SetBackground(byte r, byte g, byte b)
{
int[] elements = {COLOR_DESKTOP};
RemoveWallPaper();
System.Drawing.Color color = System.Drawing.Color.FromArgb(r,g,b);
int[] colors = { System.Drawing.ColorTranslator.ToWin32(color) };
SetSysColors(elements.Length, elements, colors);
RegistryKey key = Registry.CurrentUser.OpenSubKey("Control Panel\\Colors", true);
key.SetValue(@"Background", string.Format("{0} {1} {2}", color.R, color.G, color.B));
key.Close();
}
}
}
'@
try
{
Add-Type -TypeDefinition $code -ReferencedAssemblies System.Drawing.dll
}catch{
# An error is thrown if the type [CurrentUser.Desktop] is already created
# so we ignore it.
}
finally
{
[CurrentUser.Desktop]::SetBackground($R, $G, $B)
}