Как изменить обои рабочего стола Windows программно?
Я хотел бы установить обои для Windows XP с помощью C#. Я разработал код, поэтому он отлично работает в Windows 7, но, по-видимому, это не то же самое для XP. Я добавляю эти обои в качестве ресурса, устанавливаю его действие компиляции как контент и всегда копирую. Любопытно, что он устанавливает правильное имя обоев в диалоговом окне свойств рабочего стола. Однако обои не установлены. Мой код выглядит так:
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 PanelDesktop", 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);
}
}
при вызове обои.Установите ("wpapername"), он получает обои от ресурсы проекта. Он работает на Win7, но не на WinXP. Я делаю что-то не так?
2 ответов
Ну, это немного неудобно, но я отвечу на свой вопрос тем, что я нашел.
Я должен был использовать больше кода из принятого ответа здесь. В основном проблема в XP заключалась в том, что ей нужно было использовать файл bmp, поэтому мне удалось преобразовать ресурс проекта в файл bmp, используя этот предыдущий пример и немного настройки. Метод Set отлично работает следующим образом:
public static void Set(string wpaper, Style style)
{
using(System.Drawing.Image img = System.Drawing.Image.FromFile(Path.GetFullPath(wpaper)))
{
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);
}
важная часть находится в третьей строке этого кода (System.Drawing.Image.FromFile(Path.GetFullPath(wpaper));
).
для хорошего надежного решения.
добавьте класс foillowing в свой проект
using Microsoft.Win32;
using System;
using System.Drawing;
using System.Drawing.Imaging;
using System.IO;
using System.Runtime.InteropServices;
namespace XXXNAMESPACEXXX
{
public class Wallpaper
{
public enum Style : int
{
Tiled,
Centered,
Stretched
}
[DllImport("user32.dll")]
public static extern Int32 SystemParametersInfo(UInt32 action, UInt32 uParam, String vParam, UInt32 winIni);
public static readonly UInt32 SPI_SETDESKWALLPAPER = 0x14;
public static readonly UInt32 SPIF_UPDATEINIFILE = 0x01;
public static readonly UInt32 SPIF_SENDWININICHANGE = 0x02;
public static bool Set(string filePath, Style style)
{
bool Success = false;
try
{
Image i = System.Drawing.Image.FromFile(Path.GetFullPath(filePath));
Set(i, style);
Success = true;
}
catch //(Exception ex)
{
//ex.HandleException();
}
return Success;
}
public static bool Set(Image image, Style style)
{
bool Success = false;
try
{
string TempPath = Path.Combine(Path.GetTempPath(), "wallpaper.bmp");
image.Save(TempPath, ImageFormat.Bmp);
RegistryKey key = Registry.CurrentUser.OpenSubKey(@"Control Panel\Desktop", true);
switch (style)
{
case Style.Stretched:
key.SetValue(@"WallpaperStyle", 2.ToString());
key.SetValue(@"TileWallpaper", 0.ToString());
break;
case Style.Centered:
key.SetValue(@"WallpaperStyle", 1.ToString());
key.SetValue(@"TileWallpaper", 0.ToString());
break;
default:
case Style.Tiled:
key.SetValue(@"WallpaperStyle", 1.ToString());
key.SetValue(@"TileWallpaper", 1.ToString());
break;
}
SystemParametersInfo(SPI_SETDESKWALLPAPER, 0, TempPath, SPIF_UPDATEINIFILE | SPIF_SENDWININICHANGE);
Success = true;
}
catch //(Exception ex)
{
//ex.HandleException();
}
return Success;
}
}
}
Примечание: замените XXXNAMESPACEXXX на пространство имен по умолчанию вашего проекта.
тогда его можно использовать следующим образом:
string FilePath = TxtFilePath.Text;
Wallpaper.Set(FilePath, Wallpaper.Style.Centered);
его также можно использовать следующим образом:
if(Wallpaper.Set(FilePath, Wallpaper.Style.Centered))
{
MessageBox.Show("Your wallpaper has been set to " + FilePath);
}
else
{
MessageBox.Show("There was a problem setting the wallpaper.");
}
это проверенная работа на Windows XP, 7, 8, 8.1 и Windows 10.
Примечание стоит иметь в виду, что этот метод будет обходите любые обои для рабочего стола, применяемые сетевым администратором.