Mega Code Archive

 
Categories / Delphi / Examples
 

How do i set the wallpaper on windows98-2000 when activedesktop is turned on

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;