Aggiornare lo sfondo del desktop tramite PowerShell

Talvolta può essere utile mantenere aggiornare periodicamente il proprio desktop con un’immagine locale o scaricata da un server web interno o esterno, si pensi ad esempio se si desidera utilizzare lo sfondo del desktop impostandolo ad intervalli regolari con immagini generati da software di monitoraggio, immagini via satellite o altro.

Per impostare lo sfondo del desktop tramite PowerShell, dal momento che non è disponibile un cmdlet dedicato, è possibile invocare la funzione SystemParametersInfo in User32.dll facendo uso del cmdlet Add-Type che permette di aggiungere un tipo di dato Microsoft .NET Framework in una sessione Windows PowerShell e in particolare di aggiungere un tipo di dato corrispondente ad una classe in cui è possibile definire un metodo che invocherà la funzione SystemParametersInfo.

Di seguito il codice PowerShell per definire una classe che invoca la funzione SystemParametersInfo mediante codice Visual Basic:

Set-Variable MemberDefinition -Option Constant -Value @”
<System.Runtime.InteropServices.DllImport(“User32.dll”)>
Public Shared Function SystemParametersInfo(ByVal uiAction As System.UInt32,
ByVal uiParam As System.UInt32,
ByVal pvParam As System.String,
ByVal fWinIni As System.UInt32) As System.Int32
‘ Returns non-zero value if function succeeds
End Function
“@

Add-Type -MemberDefinition $MemberDefinition -Name “PInvoke” -Namespace Win32Functions -Language VisualBasic

Di seguito invece il codice PowerShell per impostare lo sfondo del desktop tramite la funzione SystemParametersInfo:

Set-Variable SPI_SETDESKWALLPAPER -Option Constant -Value 0x0014
Set-Variable SPIF_UPDATEINIFILE -Option Constant -Value 0x01
Set-Variable SPIF_SENDCHANGE -Option Constant -Value 0x02

[Win32Functions.PInvoke]::SystemParametersInfo($SPI_SETDESKWALLPAPER, 0, $FilePath, $SPIF_UPDATEINIFILE -bor $SPIF_SENDCHANGE)

Per quanto riguarda la posizione dello sfondo è possibile impostarlo agendo sulle chiavi di registro HKCU\Control Panel\Desktop\WallpaperStyle e HKCU\Control Panel\Desktop\TileWallpaper a riguardo si veda Theme File Format in cui viene riportato quanto segue:

TileWallpaper

0: The wallpaper picture should not be tiled
1: The wallpaper picture should be tiled

WallpaperStyle

0: The image is centered if TileWallpaper=0 or tiled if TileWallpaper=1
2: The image is stretched to fill the screen
6: The image is resized to fit the screen while maintaining the aspect ratio. (Windows 7 and later)
10: The image is resized and cropped to fill the screen while maintaining the aspect ratio. (Windows 7 and later)

Di seguito il codice PowerShell per impostare la posizione dello sfondo del desktop:

# Set Wallpaper location
Switch ( $Location )
{
Center
{
Set-ItemProperty -Path ‘HKCU:\Control Panel\Desktop\’ -Name WallpaperStyle -Value 0
Set-ItemProperty -Path ‘HKCU:\Control Panel\Desktop\’ -Name TileWallpaper -Value 0
}
Tile
{
Set-ItemProperty -Path ‘HKCU:\Control Panel\Desktop\’ -Name WallpaperStyle -Value 0
Set-ItemProperty -Path ‘HKCU:\Control Panel\Desktop\’ -Name TileWallpaper -Value 1
}
Streatch
{
Set-ItemProperty -Path ‘HKCU:\Control Panel\Desktop\’ -Name WallpaperStyle -Value 2
}
Fit
{
Set-ItemProperty -Path ‘HKCU:\Control Panel\Desktop\’ -Name WallpaperStyle -Value 6
}
Fill
{
Set-ItemProperty -Path ‘HKCU:\Control Panel\Desktop\’ -Name WallpaperStyle -Value 10
}
}

Nel mio repository su GitHub https://github.com/ermannog/PowerShell/tree/master/Set-Wallpaper ho salvato alcuni scripts che permettono di impostare lo sfondo del desktop tramite immagini provenienti da Internet, sfruttando le indicazioni del mio precedente post Comandi nativi Windows per il download di file:

  • Impostazione dello sfondo del desktop con le immagini proveniente da satelliti metereologici:
    • Set-Wallpaper-EUMETSAT_IR108Color_CentralEurope-Center.cmd
    • Set-Wallpaper-EUMETSAT_RGBNatColour_CentralEurope-Center.cmd
  • Impostazione dello sfondo del desktop con le immagini proveniente dalla NASA:
    • Set-Wallpaper-NASA_SDO_AIA_211-Center.cmd
  • Impostazione dello sfondo del desktop con le immagini del traffico Internet
    • Set-Wallpaper-InternetTrafficReport_Europe_ResponseTime-Center.cmd
    • Set-Wallpaper-InternetTrafficReport_Global-Center.cmd
    • Set-Wallpaper-InternetTrafficReport_Global_Europe-Center.cmd (in questo script è stato utilizzato il tool ImageMagick nella sua versione portable per creare un wallpaper formato da più immagini)