Главная страница | назад





Article #19661: How do I set the Wallpaper on Windows98/2000 when ActiveDesktop is turned on?

 Question and Answer Database

     FAQ: FAQ4661D - How do I set the Wallpaper on Windows98/2000 when ActiveDesktop is turned on?
Category: Miscellaneous
Platform: Windows98/2000
 Product: All32Bit,   

Question:

How do I set the Wallpaper on Windows98/2000 when ActiveDesktop is turned on?


Answer:

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;


6/21/99 2:05:55 PM
 

Last Modified: 01-SEP-99