// Es wird das Hintergrundbild des Desktops geändert. Dabei können nicht
// nur Bitmaps, sondern auch JPegs oder Gifs verwendet werden, wobei
// das Programm den Rechner automatisch auf "ActiveDesktop" umschaltet,
// wenn die Quelle kein Bitmap ist.


// Getestet mit D4 unter WinME und XP

uses 
  Registry, ComObj, ShlObj; 
 
type
  Art = (Zentriert, Gestreckt, Gekachelt); 
 
function ActiveDesktop: boolean; 
var
  h: THandle; 
begin 
  h := FindWindow('Progman', nil); 
  h := FindWindowEx(h, 0, 'SHELLDLL_DefView', nil); 
  h := FindWindowEx(h, 0, 'Internet Explorer_Server', nil); 
  result := h > 0; 
end; 
 
procedure NormalWallpaper(bmp: string; wie: Art); 
var 
  WPStyle, TileWP: string; 
  reg: TRegInifile; 
begin 
  reg := TRegInifile.Create('Control Panel\Desktop'); 
  case wie of 
    gekachelt: begin WPStyle := '0'; 
        TileWP := '1'; 
      end; 
    gestreckt: begin WPStyle := '2'; 
        TileWP := '0'; 
      end; 
  else begin WPStyle := '0'; 
      TileWP := '0'; 
    end; 
  end; 
  with reg do begin 
    writestring('', 'Wallpaper', bmp); 
    writestring('', 'TileWallpaper', TileWP); 
    writestring('', 'WallpaperStyle', WPStyle); 
    free; 
  end; 
  Systemparametersinfo(SPI_SETDESKWALLPAPER, 0, nil, spif_updateinifile); 
end; 
 
procedure ActiveWallpaper(JPG: PWideChar; wie: Art); 
const 
  CLSIDAD: TGUID = '{75048700-EF1F-11D0-9888-006097DEACF9}'; 
var 
  da: Bool; 
  AD: IActiveDesktop; 
  TCO: _tagCOMPONENTSOPT; 
  Options: _tagWALLPAPEROPT; 
begin 
  da := fileexists(JPG); 
  AD := CreateComObject(CLSIDAD) as IActiveDesktop; 
  with TCO do begin 
    dwSize := SizeOf(_tagCOMPONENTSOPT); 
    fEnableComponents := da; 
    fActiveDesktop := da; 
  end; 
  AD.SetDesktopItemOptions(TCO, 0); 
  with Options do begin 
    dwSize := SizeOf(_tagWALLPAPEROPT); 
    case wie of 
      gekachelt: dwStyle := WPSTYLE_TILE; 
      gestreckt: dwStyle := WPSTYLE_STRETCH; 
    else dwStyle := WPSTYLE_CENTER; 
    end; 
  end; 
  AD.SetWallpaper(JPG, 0); 
  AD.SetWallpaperOptions(Options, 0); 
  AD.ApplyChanges(AD_APPLY_ALL); 
end; 
 
procedure DeleteWallpaper; 
begin 
  if ActiveDesktop then 
    ActiveWallpaper('', zentriert) else 
    NormalWallpaper('', zentriert); 
end; 
 
procedure Wallpaper(bild: string; wie: Art); 
begin 
  if lowercase(extractfileext(bild)) <> '.bmp' then 
    ActiveWallpaper(StringToOLEStr(bild), wie) 
  else begin 
    DeleteWallpaper; 
    NormalWallpaper(bild, wie); 
  end; 
end; 
 
 
// --- Beispielaufrufe --- 
 
// ActiveDesktop-Hintergrundbild setzen 
procedure TForm1.Button4Click(Sender: TObject); 
begin 
  Wallpaper('c:\windows\web\wallpaper\background.jpg', gestreckt); 
end; 
 
// Normal-Hintergrundbild setzen 
procedure TForm1.Button7Click(Sender: TObject); 
begin 
  Wallpaper('c:\windows\angler.bmp', gekachelt); 
end; 
 
//  Hintergrundbild löschen 
procedure TForm1.Button5Click(Sender: TObject); 
begin 
  DeleteWallpaper; 
end;



Zugriffe seit 6.9.2001 auf Delphi-Ecke