Олег Кулабухов приводит следующий код:
Да, в данном случае стандартное изменение через SystemParametersInfo не пройдет. Придется использовать IActiveDesktop. Но учтите, что для его применения библиотека Shell32.dll должна иметь версию старше 4.71. В этом FAQ есть пример того, как узнавать версию файла, можете им воспользоваться.
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; |
[001923]