2013-05-04 2 views
2

Я хочу создать программу, которая сохраняет файл изображения BMP в драйвере и устанавливает изображение в качестве обоев. Код, который мне удалось написать, сохраняет изображение в нужном месте, но изображение не отображается в качестве обоев. Пожалуйста, помогите ...изменить обои для рабочего стола C#

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





} 

ответ

1

Кроме того, необходимо включить SPIF_SENDCHANGE при вызове SystemParametersInfo. Это необходимо, чтобы уведомить систему о том, что фон был изменен и приведет к тому, что система ответит на ваши изменения.

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

Вам нужно добавить объявление для SPIF_SENDCHANGE, который имеет значение 0x2.

The documentation говорит это о SPIF_SENDCHANGE:

Трансляции сообщение WM_SETTINGCHANGE после обновления профиля пользователя.


Тем не менее, даже без SPIF_SENDCHANGE, фон рабочего стола будет изменен на некоторых системах. Поэтому я предполагаю, что ваша основная проблема связана с вашим файлом растрового изображения. Ниже приведены некоторые возможные проблемы с вашим растровым файлом:

  1. Вы указали путь к растровому изображению неправильно.
  2. Растровое изображение по-прежнему заблокировано кодом, который его сохранил.
  3. Растровое изображение на самом деле не является растровым изображением. Возможно, вы сохранили файл .jpg в файле с расширением .bmp.

Докажите себе, что приведенный выше код работает путем создания простого растрового изображения в Paint и изменения кода выше, чтобы использовать жестко закодированный путь к этому файлу. Это убедит вас, что фон рабочего стола можно изменить.

+0

Извините за незнание, но что это значит - «Трансляция сообщения WM_SETTINGCHANGE после обновления профиля пользователя». – misha312

+1

Что происходит, так это то, что функция вызывает «SendMessage (HWND_BROADCAST, WM_SETTINGCHANGE, SPI_SETDESKWALLPAPER, ...)» после внесения изменений. Сообщение доставляется во все окна верхнего уровня. Включая окно проводника, которое рисует рабочий стол. Затем окна реагируют на сообщение, обновляя рабочий стол. –

+0

Мне нужно объявить эту функцию, как я сделал с SystemParametersInfo? – misha312

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

Успехов!