Mittwoch, 14. Juli 2010

Desktophintergrund ändern

Dieser Post zeigt, wie man mit C# den Desktophintergrund (das Wallpaper) ändert. Hierzu muss man die WinAPI - Funktion SystemParametersInfo() einbinden.
Dessen Signatur sieht so aus:
SystemParametersInfo(UInt32 uiAction, UInt32 uiParam, String pvParam, UInt32 fWinIni)

Die Funktion ist vielseitig einsetzbar zum Setzen von Systemparametern, der erste Parameter gibt die auszuführende Aktion an. Mögliche Werte des Parameters können hier nachgeschlagen werden, 4 bezeichnet beispielsweise das Aktivieren / Deaktivieren des Systemwarntons und 20 wird zum Setzen des Desktophintergrunds benötigt.
Als 2. Parameter kann bei manchen Aufrufen ein Integer - Parameter übergeben werden, dieser wird hier nicht benötigt. Wir benötigen jedoch den 3. Parameter, der in diesem Fall den Pfad zur Datei angibt, die als Desktophintergrund benutzt werden soll.
Die Datei muss ein Bild im Format .bmp sein, andere Formate müssen zuerst in dieses konvertiert werden.
Der letzte Parameter fWinIni gibt an, wie das System die Änderungen übernehmen soll. In diesem Fall wird 0x01 übergeben, was bedeutet, dass der neue Wert des Parameters in das Benutzerprofil geschrieben werden soll. Mögliche Werte des Parameters können hier nachgeschlagen werden.

Eine Beispielimplementierung (using System.Runtime.InteropServices; vorrausgesetzt):

        [DllImport("user32.dll")]
        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 void button1_Click(object sender, EventArgs e)
        {
            string Filename = "C:\\1.bmp";
            SystemParametersInfo(SPI_SETDESKWALLPAPER, 0, Filename, SPIF_UPDATEINIFILE);
        }
Auf Udo's Blog gibt es eine nette Anwendung dieses Posts, und zwar ein Programm welches tageszeitabhängig den Desktop Hintergrund wechselt.

Kommentare:

  1. Ist es möglich ein Bild aus einer Resource zu verwenden?

    AntwortenLöschen
    Antworten
    1. Ja, das geht genauso, wie wenn du das Bild für andere Sachen aus den Ressourcen laden würdest. Also einfach statt dem Dateipfad im Beispiel oben etwas wie myProject.Properties.Resources.Image01;, siehe dazu hier: http://msdn.microsoft.com/de-de/library/7k989cfy(v=vs.90).aspx

      Löschen