JPG Bilder als Desktophintergrund installieren

Ein BMP-Bild kann man leicht als Desktophintergrund verankern, in dem man nur die entsprechenden Einträge in der Registry setzt. Das geht mit einem JPG-Bild leider nicht. Dazu sind Eingriffe in den Active Desktop notwendig. Die folgende Routine zeigt ein BMP oder JPG Bild als Desktophintergrund an. Sie benötigt als Parameter den absoluten Pfad zum Bild und die Art der Anzeige (zentriert, nebeneinander, gestreckt):

Die Funktion benötigt folgende Header-Dateien:

#include <Registry.hpp> 
#include <ComObj.hpp>


/**%FUNCTION************************************************************
**
**  FUNKTIONSNAME:
%N  SetWallpaper
**
**  PARAMETER:
%I  String file,int anzeige
**  RÜCKGABEWERT:
%R  bool
**
**  BESCHREIBUNG:
%S  Zeigt ein neues Hintergrundbild (BMP oder JPG) an.
%S  String file ist der komplette Pfad zum Bild (Bsp. C:\\test\\pic01.jpg
%S  anzeige ist regelt die Art der Anzeige:
%S  0=zentriert
%S  1=nebeneinander
%S  2=gestreckt
%S  der Rückgabewert zeigt an, ob die Funktion erfolgreich war.
**
***********************************************************************/
bool SetWallpaper(String file,int anzeige)
{
if(file=="")
	return false;
bool rt=true;
TRegistry& regkey=*new TRegistry();
bool keygood=regkey.OpenKey("Control Panel\\Desktop",true);
regkey.LazyWrite=false;
if(keygood)
	{
	switch(anzeige)
		{
		case 0: // zentriert
		regkey.WriteString("WallpaperStyle","0");
		regkey.WriteString("TileWallpaper","0");
		break;

		case 1: // nebeneinander
		regkey.WriteString("WallpaperStyle","0");
		regkey.WriteString("TileWallpaper","1");
		break;

		default: // gestreckt
		regkey.WriteString("WallpaperStyle","2");
		regkey.WriteString("TileWallpaper","0");
		break;
		}
	if(ExtractFileExt(file).LowerCase()==".bmp")
		{
		regkey.WriteString("Wallpaper",file);
		rt=SystemParametersInfo(SPI_SETDESKWALLPAPER,0,file.c_str(),SPIF_SENDCHANGE);
		}
	else
		{
		IActiveDesktop *desktop;
		WideString wFile=file;
		HRESULT ap=CoCreateInstance(Shlobj::CLSID_ActiveDesktop,NULL,CLSCTX_INPROC_SERVER,IID_IActiveDesktop,(void**)&desktop);
		if(ap!=S_OK)
			rt=false;
		else
			{
			desktop->SetWallpaper(wFile,0);
			desktop->ApplyChanges(AD_APPLY_ALL|AD_APPLY_FORCE);
			}
		delete desktop;
		}
	}
else
	rt=false;
regkey.CloseKey();
delete &regkey;
return rt;
}
//---------------------------------------------------------------------------

Wer Fehler im Stil von

[C++ Error] shobjidl.h(2193): E2238 Multiple declaration for 'FOLDERSETTINGS' 
[C++ Error] shobjidl.h(8095): E2238 Multiple declaration for 'DESKBANDINFO' 
[C++ Error] shlobj.h(1422): E2238 Multiple declaration for 'FVSHOWINFO' 
[C++ Error] shlobj.h(3457): E2238 Multiple declaration for 'SHELLFLAGSTATE' 

bekommt, sollte unter Projekt->Optionen->Verzeichisse/Bedingungen dort unter Bedingungen NO_WIN32_LEAN_AND_MEAN eintragen.

Zur Übersicht