更改桌面壁纸c#

时间:2013-05-04 16:21:32

标签: c# desktop wallpaper

我想创建一个程序,在驱动程序上保存bmp图像文件,并将图像设置为墙纸。我设法写的代码将图像保存在正确的位置,但图像不会显示为壁纸。请帮忙......

class Program
{
    [DllImport("user32.dll", CharSet = CharSet.Auto)]
    private static extern Int32 SystemParametersInfo(UInt32 uiAction, UInt32
    uiParam,String pvParam, UInt32 fWinIni);
    private static UInt32 SPI_SETDESKWALLPAPER = 20;
    private static UInt32 SPIF_UPDATEINIFILE = 0x1;
    private String imageFileName = "D:\\wall.bmp";


    static void Main(string[] args)
    {
        Bitmap bmp = new Bitmap(Properties.Resources.wall);
        bmp.Save("D:\\wall.bmp");
        SystemParametersInfo(SPI_SETDESKWALLPAPER, 0, "D:\\wall.bmp", SPIF_UPDATEINIFILE);
    }





}

2 个答案:

答案 0 :(得分:3)

您可以尝试编写此类Here

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(Uri uri, Style style)
    {
        System.IO.Stream s = new System.Net.WebClient().OpenRead(uri.ToString());

        System.Drawing.Image img = System.Drawing.Image.FromStream(s);
        string tempPath = Path.Combine(Path.GetTempPath(), "wallpaper.bmp");
        img.Save(tempPath, System.Drawing.Imaging.ImageFormat.Bmp);

        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());
        }

        SystemParametersInfo(SPI_SETDESKWALLPAPER,
            0,
            tempPath,
            SPIF_UPDATEINIFILE | SPIF_SENDWININICHANGE);
    }
}
祝你好运!

答案 1 :(得分:1)

致电SPIF_SENDCHANGE时,您还需要加入SystemParametersInfo。这需要通知系统后台已更改,并将导致系统响应您的更改。

SystemParametersInfo(
    SPI_SETDESKWALLPAPER, 
    0, 
    @"D:\wall.bmp", 
    SPIF_UPDATEINIFILE | SPIF_SENDCHANGE
);

您需要为SPIF_SENDCHANGE添加一个值为0x2的声明。

documentation说明SPIF_SENDCHANGE

  

在更新用户配置文件后广播WM_SETTINGCHANGE消息。


即使没有SPIF_SENDCHANGE,即使没有{{1}},桌面背景也会在某些系统上更改。所以我的猜测是你的主要问题实际上是你的位图文件。以下是您的位图文件可能存在的一些问题:

  1. 您已错误地指定了位图的路径。
  2. 位图仍然被保存它的代码锁定。
  3. 位图实际上不是位图。也许您将.jpg保存到扩展名为.bmp的文件中。
  4. 通过在Paint中创建一个简单的位图并更改上面的代码以使用该文件的硬编码路径来证明上面的代码。这将说服您可以更改桌面背景。