Как последовательно менять фон рабочего стола с помощью Powershell - PullRequest
0 голосов
/ 22 апреля 2020

Я пытаюсь изменить фон рабочего стола с помощью 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. Я использую Windows 7 32-разрядную версию с Powershell V5.

Любопытное примечание: я запускаю один и тот же код в Powershell V6 на одном и том же компьютере, и код выполняется безошибочно каждый раз. Любая идея о том, почему это может быть и как я мог бы заставить его работать последовательно на Powershell V5?

1 Ответ

0 голосов
/ 25 апреля 2020

Вы можете попробовать использовать SystemParametersInfo функцию user32.dll, например:

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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...