首页 > 解决方案 > 如何使用 Powershell 一致地更改桌面背景

问题描述

我正在尝试使用 Powershell 更改桌面背景。我一直在尝试使用以下仅在某些时候有效的代码。

Remove-ItemProperty -path "HKCU:\Control Panel\Desktop" -name WallPaper -Force
Set-ItemProperty -path 'HKCU:\Control Panel\Desktop\' -name Wallpaper -value $wallpaper -Force
RUNDLL32.EXE USER32.DLL,UpdatePerUserSystemParameters ,1 ,True

我已经尝试了这个代码的许多其他变体,例如使用 Start-Sleep 添加延迟或使用 Start-Job {RUNDLL32.EXE ...} 然后使用 Wait-Job。

我猜想尝试使用 RUNDLL32.exe 有点奇怪。我正在使用 Powershell V5 运行 Windows 7 32 位。

奇怪的旁注,我在同一台计算机上的 Powershell V6 中运行相同的代码,并且代码每次都能完美运行。关于为什么会这样以及我如何能够让它在 Powershell V5 上始终如一地工作的任何想法?

标签: powershell

解决方案


您可以尝试使用user32.dll的SystemParametersInfo函数,如下所示:

Add-Type -TypeDefinition @'
using System.Runtime.InteropServices;
public class Wallpaper {
    public const uint SPI_SETDESKWALLPAPER = 0x0014;
    public const uint SPIF_UPDATEINIFILE = 0x01;
    public const uint SPIF_SENDWININICHANGE = 0x02;
    [DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)]
    private static extern int SystemParametersInfo (uint uAction, uint uParam, string lpvParam, uint fuWinIni);
    public static void SetWallpaper (string path) {
        SystemParametersInfo(SPI_SETDESKWALLPAPER, 0, path, SPIF_UPDATEINIFILE | SPIF_SENDWININICHANGE);
    }
}
'@


$wallpaper = 'X:\pictures\mywallpaper.jpg'  # absolute path to the image file
[Wallpaper]::SetWallpaper($wallpaper)

推荐阅读