# Welche Registry-Werte ändern um JPG als Wallpaper bei WinXP einzustellen?



## Shakie (24. August 2006)

Hallo und guten Morgen!

Mein Vorhaben: ein Programm zu schreiben, dass meinen Desktophintergrund ändern kann.

Da es im Internet Hunderttausendtrilliarden Programme gibt, die das bereits können, dachte ich mir, das kann ja nicht so schwierig zum selber machen sein.
Zuerst habe ich diesen Tipp über die API-Funktion SystemParametersInfo gefunden. Diese funktioniert aber nur mit BMP-Dateien.
Damit wollte ich mich aber nicht zufrieden stellen. Nun habe ich weitergesucht und verschiedene Tipps im Internet haben mich auf die Registrierungs-Daten "*OriginalWallpaper*", "*Wallpaper*" sowie "*ConvertedWallpaper*"  im Schlüssel "*HKEY_CURRENT_USER\Control Panel\Desktop*" hingewiesen. Wenn ich dort was ändere passiert aber überhaupt gar nichts, auch nicht wenn ich den Desktop mit F5 aktualisiere. Wenn ich mich daraufhin im Windows neu anmelde, ist mein Desktophintergrund schwarz.
Dann habe ich herausgefunden, dass es noch einen weiteren Ort in der Microsoftwelt gibt, wo der Pfad des Hintergrundbildes gespeichert wird:
"*HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\Desktop\General*" --> "*Wallpaper*"
Dieser Wert wird verwendet, wenn man eine GIF-Datei als Hintergrundbild einstellt.
Egal welchen Wert ich in der Registry nun aber ändere, mein Desktopbild ändert sich nicht bzw. wird nach einer Neuanmeldung schwarz.

*Meine Frage an euch:* Was muss ich tun damit ich eine beliebige Bilddatei (und somit nicht nur BMPs) als Desktophintergrund per Programmcode einstellen kann und ich maximal noch zusätzlich F5 drücken muss?


----------



## Matthias Reitinger (24. August 2006)

Hallo,

du musst die jeweilige Datei im BMP-Format vorliegen haben, sonst kannst du sie nicht als Desktophintergrund verwenden. Notfalls muss man eben vorher eine Konvertierung durchführen.

Grüße,
 Matthias


----------



## Shakie (24. August 2006)

Aber wie macht Windows das dann, wenn ich eine Gif-*Animation* als Hintergrund einstelle? Die kann man ja schlecht nach BMP konvertieren, es sei denn man macht mehrere Bilder draus.

Gibt es denn eine DLL im Windows der ich sagen kann "verwende dieses Bild und konvertiere es so wie du lustig bist"?


----------



## Matthias Reitinger (24. August 2006)

Hallo,



			
				Shakie hat gesagt.:
			
		

> Aber wie macht Windows das dann, wenn ich eine Gif-*Animation* als Hintergrund einstelle? Die kann man ja schlecht nach BMP konvertieren, es sei denn man macht mehrere Bilder draus.


Das läuft dann vermutlich über ActiveDesktop (auf den Desktop gelegte Instanzen des Internet Explorers), was dann kein Desktophintergrund im eigentlichen Sinne mehr ist.



> Gibt es denn eine DLL im Windows der ich sagen kann "verwende dieses Bild und konvertiere es so wie du lustig bist"?


Das müsste wohl u.a. mit GDI+ möglich sein.

Grüße,
 Matthias


----------



## Shakie (25. August 2006)

Mit GDI+ habe ich mich noch nie befasst. Und ich bin mir auch nicht sicher ob ich richtig verstanden habe, was das sein soll ^^

Die MSDN hat mir das hier geliefert: IActiveDesktop

Ich möchte gerne in *VB.Net* programmieren und habe folgendes Codebeispiel für *C++* gefunden:

```
HRESULT hr;
IActiveDesktop *pActiveDesktop;

//Create an instance of the Active Desktop
hr = CoCreateInstance(CLSID_ActiveDesktop, NULL, CLSCTX_INPROC_SERVER,
                      IID_IActiveDesktop, (void**)&pActiveDesktop);

//Insert code to call the IActiveDesktop methods
//Hier würde dann wohl pActiveDesktop->SetWallpaper("C:\TollesBild.jpg", 0) reinkommen, oder?

// Call the Release method
pActiveDesktop->Release();
```

Kann mir jemand beim Übersetzen nach VB.Net helfen?
Ich scheitere nämlich daran, die Parameter der CoCreateInstance zu übernehmen. Außerdem habe ich noch nie mit Pointern in VB.Net gearbeitet (glaub ich jedenfalls )

```
Private Declare Function CoCreateInstance Lib "ole32.dll" ( _
                    ByVal rclsid As String, _
                    ByVal pUnkOuter As Long, _
                    ByVal dwClsContext As Long, _
                    ByVal riid As String, _
                    ByRef ppv As Object) As Long
```
Wie kriege ich jetzt ein IActiveDesktop-Objekt her, so dass ich die SetWallpaper-Methode aufrufen kann? Muss ich noch in den Projekteigenschaften eine Referenz auf Shell32.dll setzen?

Ich habe noch diesen Link gefunden, wo zwar nicht das IActiveDesktop-Objekt verwendet wird, dafür aber die CoCreateInstance-Funktion. Daraus versuche ich jetzt irgendwie mir was zusammen zu puzzeln.
Mein größtes Problem ist aber, dass mir Hintergrundwissen zur GUID fehlt und ich nicht verstehe, was die CoCreateFunktion alles machen.
Was zum Beispiel bedeutet:

```
/Klassenid und Interfaceid festlegen
Dim CLSID_FILTERGRAPH As New System.Guid("{E436EBB3-524F-11CE-9F53-0020AF0BA770}")
```
. Eine ähnlich komische Zeichenkette ist mir schon mal in der Windows-Registry über den Weg gelaufen.


----------

