We help IT Professionals succeed at work.

desktop wallpaper

hugh34
hugh34 asked
on
how can i remove the current desktop wallpaper and make the background go black in code? (active desktop is on)


cheers

hugh34
Comment
Watch Question

Jason SwebyTechnical Director
CERTIFIED EXPERT

Commented:
This answer from the Borland Community site:

You may have noticed that using SystemParametersInfo
to change the wallpaper when ActiveDesktop is turned on
doesn't work. The reason is because you need to use
the IActiveDesktop COM interface. Using  SystemParametersInfo still works, but it doesn't update the wallpaper.

Note that the IActiveDesktop interface requires a
Shell32.dll version >= 4.71. The document titled
"Get a File Version" demonstrates how to check the
file version and uses the shell32.dll as an example.

Here is an example of using IActiveDesktop to work with
the wallpaper. It assumes that you have 3 labels on a form
and two buttons with the default names.

uses
  ComObj,  // For CreateComObject and Initialization/Finalization of COM
  ShlObj;  // For IActiveDesktop

{  The CLASS ID for ActiveDesktop is not defined in
   ShlObj, while the IID is so we define it here. }
const
  CLSID_ActiveDesktop: TGUID = '{75048700-EF1F-11D0-9888-006097DEACF9}';

{ Demonstrate getting the Wallpaper }
procedure TForm1.Button1Click(Sender: TObject);
var
  ActiveDesktop: IActiveDesktop;
  CurrentWallpaper: string;
  CurrentPattern: string;
  WallpaperOptions: TWallpaperOpt;
  tmpBuffer: PWideChar;
begin
  // Create the ActiveDesktop COM Object
  ActiveDesktop := CreateComObject(CLSID_ActiveDesktop) as IActiveDesktop;

  // We now need to allocate some memory to get the current Wallpaper.
  // However, tmpBuffer is a PWideChar which means 2 bytes make
  // up one Char. In order to compenstate for the WideChar, we
  // allocate enough memory for MAX_PATH*2
  tmpBuffer := AllocMem(MAX_PATH*2);
  try
    ActiveDesktop.GetWallpaper(tmpBuffer, MAX_PATH*2, 0);
    CurrentWallpaper := tmpBuffer;
  finally
    FreeMem(tmpBuffer);
  end;
  if CurrentWallpaper <> '' then
    Label1.Caption := 'Current Wallpaper: ' + CurrentWallpaper
  else
    Label1.Caption := 'No Wallpaper set';

  // Now get the current Wallpaper options.
  // The second parameter is reserved and must be 0.
  WallpaperOptions.dwSize := SizeOf(WallpaperOptions);
  ActiveDesktop.GetWallpaperOptions(WallpaperOptions, 0);
  case WallpaperOptions.dwStyle of
    WPSTYLE_CENTER:  Label2.Caption := 'Centered';
    WPSTYLE_TILE:    Label2.Caption := 'Tiled';
    WPSTYLE_STRETCH: Label2.Caption := 'Stretched';
    WPSTYLE_MAX:     Label2.Caption := 'Maxed';
  end;

  // Now get the desktop pattern.
  // The pattern is a string of decimals whose bit pattern
  // represents a picture. Each decimal represents the on/off state
  // of the 8 pixels in that row.
  tmpBuffer := AllocMem(256);
  try
    ActiveDesktop.GetPattern(tmpBuffer, 256, 0);
    CurrentPattern := tmpBuffer;
  finally
    FreeMem(tmpBuffer);
  end;
  if CurrentPattern <> '' then
    Label3.Caption := CurrentPattern
  else
    Label3.Caption := 'No Pattern set';
end;

{ Demonstrate setting the wallpaper }

procedure TForm1.Button2Click(Sender: TObject);
var
  ActiveDesktop: IActiveDesktop;
begin
  ActiveDesktop := CreateComObject(CLSID_ActiveDesktop)
    as IActiveDesktop;
  ActiveDesktop.SetWallpaper('c:\downloads\images\test.bmp', 0);
  ActiveDesktop.ApplyChanges(AD_APPLY_ALL or AD_APPLY_FORCE);
end;

J.

Commented:
Listening
Mohammed NasmanSoftware Developer
CERTIFIED EXPERT

Commented:
Hello

 you can remove the wallpaper in the following code
uses
  ComObj,ShlObj;
procedure TForm1.Button1Click(Sender: TObject);
var
  ActiveDesktop: IActiveDesktop;
begin
  ActiveDesktop := CreateComObject(CLSID_ActiveDesktop)
    as IActiveDesktop;
  ActiveDesktop.SetWallpaper('', 0);
  ActiveDesktop.ApplyChanges(AD_APPLY_ALL or AD_APPLY_FORCE);
end;

change the background color from the registry, in key:
HKEY_CURRENT_USER\Control Panel\Colors
change the Background=0 0 0 for black color

Best regards
Mohammed Nasman
Software Developer
CERTIFIED EXPERT
Commented:
Hello

  sorry about last comment I had a wrong in it, you can change the background color using SetSysColors API, not change the values in the registry, so here's new samples will remove the background image, and set the background to black

uses
  ComObj,ShlObj;
procedure TForm1.Button1Click(Sender: TObject);
var
  ActiveDesktop: IActiveDesktop;
  Color : TColor;
  Element : DWord;
begin
 Color := clBlack;
 Element := COLOR_BACKGROUND;
  ActiveDesktop := CreateComObject(CLSID_ActiveDesktop)
    as IActiveDesktop;
  ActiveDesktop.SetWallpaper('', 0);
  ActiveDesktop.ApplyChanges(AD_APPLY_ALL or AD_APPLY_FORCE);
  // this code to change the back groud color
  SetSysColors(1,Element,Color);
end;


Best regards
Mohammed Nasman