2010-09-10 3 views
1

Я пытаюсь изменить обои рабочего стола каждые 5 минут автоматически (для цели отладки он настроен на 5 секунд).Автоматическое изменение обоев рабочего стола

Я нашел стандартный метод вызова API SystemParametersInfo() из .net-кода со стандартными параметрами.

Я их сделал. Но я обнаружил, что он берет только файлы Bmp. У меня огромная коллекция Jpg, которую я предпочитаю ставить на рабочий стол.

Ну, я нашел несколько предложений по преобразованию Jpg в Bmp с использованием метода Image.Save(). Я не люблю этого.

Что такое прямой метод установки Jpg на рабочем столе? Думаю, User32.dll должен предоставить ему способ.

Вот код для справки:

using System; 
using System.Collections.Generic; 
using System.Text; 
using System.Runtime.InteropServices; 
using System.IO; 
using System.Timers; 

namespace ChangeWallpaper 
{ 
    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:\TEMP"); 
      images = dirInfo.GetFiles("*.jpg", SearchOption.TopDirectoryOnly); 

      currentImage = 0; 

      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 = 20; 
      const int SPIF_UPDATEINIFILE = 0x01; 
      const int SPIF_SENDWININICHANGE = 0x02; 

      SystemParametersInfo(SPI_SETDESKWALLPAPER, 0, images[currentImage++].FullName, SPIF_SENDWININICHANGE | SPIF_UPDATEINIFILE);    
      currentImage = (currentImage >= images.Length) ? 0 : currentImage; 
     } 
    } 
} 

ответ

1

Вот образец, чтобы изменить обои тот же выше код немного изменен и написано для Windows. Здесь используется опция Timer-Control и 'ShowInTaskbar' формы для 'False' и 'WindowState' для 'Minimized'.

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Linq; 
using System.Text; 
using System.Windows.Forms; 
using System.Runtime.InteropServices; 
using System.IO; 
//using System.Timers; 

namespace Screen 
{ 
    public partial class Form1 : Form 
    { 
     public Form1() 
     { 
      InitializeComponent(); 
     } 
     [DllImport("user32.dll")] 
     public static extern bool SystemParametersInfo(UInt32 uiAction, UInt32 uiParam,  string pvParam, UInt32 fWinIni); 
     static FileInfo[] images; 
     static int currentImage; 

     private void timer1_Tick(object sender, EventArgs e) 
     {    
      const uint SPI_SETDESKWALLPAPER = 20; 
      const int SPIF_UPDATEINIFILE = 0x01; 
      const int SPIF_SENDWININICHANGE = 0x02; 
      SystemParametersInfo(SPI_SETDESKWALLPAPER, 0,  images[currentImage++].FullName, SPIF_SENDWININICHANGE | SPIF_UPDATEINIFILE); 
      currentImage = (currentImage >= images.Length) ? 0 : currentImage; 
     } 

     private void Form1_Load(object sender, EventArgs e) 
     { 
      DirectoryInfo dirInfo = new DirectoryInfo(@"C:\TEMP"); 
      images = dirInfo.GetFiles("*.jpg", SearchOption.TopDirectoryOnly); 
      currentImage = 0; 
     } 
    } 
} 
1

Это может помочь: http://code.msdn.microsoft.com/windowsdesktop/CSSetDesktopWallpaper-2107409c/sourcecode?fileId=21700&pathId=734742078

Это подробно описано, как JPGs можно использовать после того, как Vista, а также касается стилей обоев. Однако похоже, что вам нужно использовать реестр для изменения стиля обоев (в центре, плитка, растяжка и т. Д.).

+0

также полезен: http://www.blackwasp.co.uk/Wallpaper.aspx – prasanthv