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

3 回答 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);
        }
    }
}
于 2013-02-24T14:47:11.607 回答
1

SPI_SETDESKWALLPAPERshould be0x14和 not的值30

SPIF_UPDATEINIFILE应该SPIF_SENDWININICHANGEuint类型。

const uint SPI_SETDESKWALLPAPER = 0x14;
const uint SPIF_UPDATEINIFILE = 0x01;
const uint SPIF_SENDWININICHANGE = 0x02;
于 2013-02-24T13:11:59.910 回答
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);
}
于 2013-02-24T14:05:55.110 回答