【问题标题】:change desktop wallpaper c# [duplicate]更改桌面壁纸c#[重复]
【发布时间】:2013-05-04 16:21:31
【问题描述】:

我想创建一个程序,将 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);
    }





}

【问题讨论】:

    标签: c# desktop wallpaper


    【解决方案1】:

    你可以试试这个Here写的Class:

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

    祝你好运!

    【讨论】:

      【解决方案2】:

      您还需要在拨打SystemParametersInfo 时加入SPIF_SENDCHANGE。这需要通知系统背景已更改,并将导致系统响应您的更改。

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

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

      documentation 这么说SPIF_SENDCHANGE:

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


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

      1. 您指定的位图路径不正确。
      2. 位图仍被保存它的代码锁定。
      3. 位图实际上不是位图。也许您将 .jpg 保存到扩展名为 .bmp 的文件中。

      通过在 Paint 中创建一个简单的位图并更改上面的代码以使用该文件的硬编码路径,向自己证明上面的代码有效。这会让您相信可以更改桌面背景。

      【讨论】:

      • 抱歉我的无知,这是什么意思 - “更新用户配置文件后广播 WM_SETTINGCHANGE 消息。”
      • 发生的情况是该函数在进行更改后调用SendMessage(HWND_BROADCAST, WM_SETTINGCHANGE, SPI_SETDESKWALLPAPER, ...)。消息被传递到所有顶级窗口。包括绘制桌面的资源管理器窗口。然后,该窗口通过刷新桌面来响应消息。
      • 我需要像使用 SystemParametersInfo 一样声明这个函数吗?
      • 不!您只需要像我的回答中所说的那样添加| SPIF_SENDCHANGE。你不打电话给 SendMessage。让 SystemParametersInfo 来做吧。
      • :-( 不行....
      猜你喜欢
      • 1970-01-01
      • 2017-06-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多