Public/Set-DesktopWallpaper.ps1
function Set-DesktopWallpaper { <# .SYNOPSIS Функия устанавливает обои на Рабочий стол. .DESCRIPTION Функция вызывает SystemParametersInfo для установки обоев на Рабочий стол. .PARAMETER Path Путь к изображению. .PARAMETER Style Стиль размещния изобращения (растянуть, замостить и т.п.). Допустимые значения - Tiled, Centered, Stretched и Fit. .EXAMPLE $cWallpaperImagePath = 'C:\Tools\_aux\pic\Wallpaper23.jpg' Set-DesktopWallpaper -Path $cWallpaperImagePath .INPUTS Путь к файлу с изображением. .NOTES Функция использует вставку на C# для описания класса "установщика" обоев на Рабочий стол. Грубо говоря, все сводится к вызову функции SystemParametersInfo из user32.dll. Подробнее о функции можно почитать на https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-systemparametersinfow , но легче от этого не станет... Сам код найден в Интернте, он там уже давно (как минимум, в 2013 году уже встречался) и информации об авторе найти не удалось. #> [CmdletBinding()] param ( [Parameter(Mandatory = $true, ValueFromPipeline = $true, Position = 0)] [System.String] $Path, [Parameter(Mandatory = $false, ValueFromPipeline = $false, Position = 1)] [ValidateSet('Tiled', 'Centered', 'Stretched', 'Fit')] [System.String] $Style = 'Stretched' ) begin { try { $TypeDefinition = @" using System; using System.Runtime.InteropServices; 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 lpvParam, int fuWinIni); public static void SetWallpaper (string path) { SystemParametersInfo( SetDesktopWallpaper, 0, path, UpdateIniFile | SendWinIniChange ); } } } "@ if (-not ([System.Management.Automation.PSTypeName]'Wallpaper.Setter').Type) { Add-Type -TypeDefinition $TypeDefinition } } catch { # if ($PSitem.FullyQualifiedErrorId -eq 'TYPE_ALREADY_EXISTS,Microsoft.PowerShell.Commands.AddTypeCommand') { # Write-Warning -Message $PSitem.Exception.Message # } Write-Error -Exception $PSItem.Exception } } process { try { if ($IsLinux) { throw [System.Configuration.ConfigurationException]::New('This operation system does not supported.') } [Wallpaper.Setter]::SetWallpaper((Convert-Path $Path)) Set-ItemProperty -Path "HKCU:\Control Panel\Desktop" -Name 'WallPaper' -Value $Path switch ($Style) { 'Fit' { Set-ItemProperty -Path "HKCU:\Control Panel\Desktop" -Name 'WallpaperStyle' -Value 6 Set-ItemProperty -Path "HKCU:\Control Panel\Desktop" -Name 'TileWallpaper' -Value 0 break } 'Tiled' { Set-ItemProperty -Path "HKCU:\Control Panel\Desktop" -Name 'WallpaperStyle' -Value 1 Set-ItemProperty -Path "HKCU:\Control Panel\Desktop" -Name 'TileWallpaper' -Value 1 break } 'Centered' { Set-ItemProperty -Path "HKCU:\Control Panel\Desktop" -Name 'WallpaperStyle' -Value 1 Set-ItemProperty -Path "HKCU:\Control Panel\Desktop" -Name 'TileWallpaper' -Value 0 break } Default { Set-ItemProperty -Path "HKCU:\Control Panel\Desktop" -Name 'WallpaperStyle' -Value 2 Set-ItemProperty -Path "HKCU:\Control Panel\Desktop" -Name 'TileWallpaper' -Value 0 break } } } catch { # $PSCmdlet.ThrowTerminatingError($PSitem) Write-Error -Exception $PSItem.Exception } } end { } } |