Как программно изменить обои рабочего стола Windows?

Я бы хотел установить обои для Windows XP, используя C#. Я разработал код так, что он отлично работает в Windows 7, но, видимо, для XP это не так. Я добавляю обои в качестве ресурса, устанавливаю действие компиляции как Content и Always copy. Любопытно, что в диалоговом окне свойств рабочего стола устанавливается правильное имя обоев. Однако обои не устанавливаются. Мой код выглядит так:

public sealed class Wallpaper
{
    Wallpaper() { }

    const int SPI_SETDESKWALLPAPER = 20;
    const int SPIF_UPDATEINIFILE = 0x01;
    const int SPIF_SENDWININICHANGE = 0x02;

    [DllImport("user32.dll", CharSet = CharSet.Auto)]
    static extern int SystemParametersInfo(int uAction, int uParam, string lpvParam, int fuWinIni);

    public enum Style : int
    {
        Tiled,
        Centered,
        Stretched
    }

    public static void Set(string wpaper, Style style)
    {
        RegistryKey key = Registry.CurrentUser.OpenSubKey(@"Control Panel\Desktop", true);
        if (style == Style.Stretched)
        {
            key.SetValue(@"WallpaperStyle", 2.ToString());
            key.SetValue(@"TileWallpaper", 0.ToString());
        }

        if (style == Style.Centered)
        {
            key.SetValue(@"WallpaperStyle", 1.ToString());
            key.SetValue(@"TileWallpaper", 0.ToString());
        }

        if (style == Style.Tiled)
        {
            key.SetValue(@"WallpaperStyle", 1.ToString());
            key.SetValue(@"TileWallpaper", 1.ToString());
        }

        string tempPath = "Resources\\"+wpaper;
        SystemParametersInfo(SPI_SETDESKWALLPAPER,
            0,
            tempPath,
            SPIF_UPDATEINIFILE | SPIF_SENDWININICHANGE);
    }
}

При вызове Wallpaper.Set("wpapername") он получает обои из ресурсов проекта. Это работает на Win7, но не на WinXP. Я что-то делаю не так?

12
задан Cœur 14 November 2019 в 03:23
поделиться