定期更改桌面墙纸

时间:2013-02-24 11:22:30

标签: c# winforms

使用以下代码设置桌面墙纸时出现问题。 SystemParametersInfo返回true但不更改壁纸。没有任何变化,它与以前一样。但我希望代码定期从* .bmp文件目录中更改壁纸。请让我知道我在哪里弄错了。

class Program
{
    [DllImport("user32.dll")]
    public static extern bool SystemParametersInfo(UInt32 uiAction, UInt32 uiParam, string pvParam, UInt32 fWinIni);
    static FileInfo[] images;
    static int currentImage;

    static void Main(string[] args)
    {
        DirectoryInfo dirInfo = new DirectoryInfo(@"C:/users/Smart-PC/Desktop");
        images = dirInfo.GetFiles("*.bmp", SearchOption.TopDirectoryOnly);

        currentImage = 0;

        System.Timers.Timer imageChangeTimer = new Timer(5000);
        imageChangeTimer.Elapsed += new ElapsedEventHandler(imageChangeTimer_Elapsed);
        imageChangeTimer.Start();

        Console.ReadLine();
    }

    static void imageChangeTimer_Elapsed(object sender, ElapsedEventArgs e)
    {
        const uint SPI_SETDESKWALLPAPER = 30;
        const int SPIF_UPDATEINIFILE = 0x01;
        const int SPIF_SENDWININICHANGE = 0x02;
        bool gk;
        gk = SystemParametersInfo(SPI_SETDESKWALLPAPER, 0, images[currentImage++].FullName, SPIF_SENDWININICHANGE | SPIF_UPDATEINIFILE);
        Console.Write(gk);
        Console.WriteLine(images[currentImage].FullName);
        currentImage = (currentImage >= images.Length) ? 0 : currentImage;
    }
}

3 个答案:

答案 0 :(得分:1)

SPI_SETDESKWALLPAPER的值应为0x14,而不是30

SPIF_UPDATEINIFILESPIF_SENDWININICHANGE也应为uint类型。

  
const uint SPI_SETDESKWALLPAPER = 0x14;
const uint SPIF_UPDATEINIFILE = 0x01;
const uint SPIF_SENDWININICHANGE = 0x02;
  

答案 1 :(得分:1)

我写了一个非常相似的应用程序,我使用这些值,它适用于我:

public void SetWallpaper(String path)
{
    // DLL Import
    [DllImport("user32.dll", CharSet = CharSet.Auto)]
    private static extern int SystemParametersInfo(
        Int32 uAction, 
        Int32 uParam, 
        String lpvParam, 
        Int32 fuWinIni);

    // Consts
    private const Int32 SPI_SETDESKWALLPAPER = 20;
    private const Int32 SPIF_UPDATEINIFILE = 0x01;
    private const Int32 SPIF_SENDWININICHANGE = 0x02;

    // Changing the background.
    SystemParametersInfo(
        SPI_SETDESKWALLPAPER, 
        0, 
        path, // desktopBackground is the bmp location
        SPIF_UPDATEINIFILE | SPIF_SENDWININICHANGE);
}

答案 2 :(得分:1)

我刚试过这个,它对我有用。顺便说一句,根据操作系统,它只适用于Bitmaps,如果您尝试任何其他格式,则需要转换为位图。

using System;
using System.Runtime.InteropServices;

namespace ConsoleApplication1
{
    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 static String imageFileName = "c:\\test\\test.bmp";

        static void Main(string[] args)
        {
            SetImage(imageFileName);
            Console.ReadKey();
        }

        private static void SetImage(string filename)
        {
            SystemParametersInfo(SPI_SETDESKWALLPAPER, 0, filename, SPIF_UPDATEINIFILE);
        }
    }
}