定期更换桌面壁纸

4

我使用以下代码设置桌面壁纸时遇到了问题。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;
    }
}

虽然与您当前的问题无关,但是您下一个问题是:在Console.WriteLine(images[currentImage].FullName);这一行会出现“IndexOutOfRangeException”。 - Mohammad Dehghan
是的,我已经弄清楚了,但我并不太关心这个。我只是为了参考添加了那个语句。 - Coding active
有任何异常被抛出吗? - Ian R. O'Brien
3个回答

2

我刚刚测试了一下,对我来说可以用。顺便说一句,根据操作系统的不同,它只能使用位图格式,如果您尝试使用其他格式,则需要转换为位图格式。

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

2
它仅适用于 .jpg 文件,不适用于 .bmp 文件。谢谢! - Coding active

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
30 = 1ESPI_SETDOUBLECLKHEIGHT - Akram Berkawy
在这种情况下,如果SPI_SETDESKWALLPAPER = 0x14,则返回false并且仍然相同。 - Coding active
@codingactive 你是在测试XP还是Win7? - Akram Berkawy
我正在Windows 7上使用这个。 - Coding active
它可以很好地处理.jpg文件,我认为在进行更改之前,我需要将格式从.bmp更改为.jpg。 - Coding active

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接