2013-02-24 104 views
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; 
    } 
} 
+0

不相关的当前的问题,但你的下一个问题是:你会得到'IndexOutOfRangeException'就行'Console.WriteLine(图像[currentImage] .FullName);'。 – 2013-02-24 11:44:15

+0

是的,我明白了这一点,但我并不太在意这一点。我添加了该陈述仅供参考。 – 2013-02-24 12:27:57

+0

是否有任何异常被抛出? – 2013-02-24 14:43:26

回答

1

我只是测试这一点,它为我工作。顺便说一句,取决于操作系统,它只适用于位图,如果你想尝试任何其他格式,则需要转换为位图。

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文件。谢谢 ! – 2013-02-24 16:03:53

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' ='1E'是'SPI_SETDOUBLECLKHEIGHT' – 2013-02-24 13:14:09

+0

在这种情况下,SPI_SETDESKWALLPAPER = 0x14它返回false并且仍然相同。 – 2013-02-24 13:45:55

+0

@codingactive你在XP或Win7上测试吗? – 2013-02-24 13:53:07

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