Thursday, November 18, 2010

How do I change user settings with Delphi?

I want to be able to change user settings, specifically the user's wallpaper, with Pascal.



I thought about editing the file that stores the user settings, but that wouldn't update it immediately, so how would I go about doing this?How do I change user settings with Delphi?
Hi there,



You can do what you want by using the registry.

The wallpaper is set using the

HKEY_CURRENT_USER\Control Panel\Desktop

WallPaper = path to image



---------- listing ----------

// 1.



uses

Registry;



procedure SetWallpaper(sWallPaperBMPPath: string; bTile: Boolean);

var

reg: TRegIniFile;

begin

reg := TRegIniFile.Create('Control Panel\Desktop');

try

with reg do

begin

WriteString('', 'Wallpaper', sWallPaperBMPPath);

WriteString('', 'TileWallpaper', IntToStr(Ord(bTile)));

end;

finally

reg.Free;

end;

SystemParametersInfo(SPI_SETDESKWALLPAPE?0, nil, SPIF_SENDWININICHANGE);

end;



// 2.



procedure TForm1.Button1Click(Sender: TObject);

var

sWallPaperBMPPath: string;

begin

sWallPaperBMPPath := 'C:\[WinDIR]\wall.bmp';

if not SystemParametersInfo(SPI_SETDESKWALLPAPE?0, Pointer(sWallPaperBMPPath),

SPIF_SENDWININICHANGE) then

ShowMessage('Succesful.')

else

ShowMessage('Failed!');

end;





// 3. Set the wallpaper for the Active Desktop.

{

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.

Requires Internet Explorer 4.0 or later).

}



uses

ShlObj, ComObj;





function ChangeWallpaper(aFile: String): Boolean;

const

CLSID_ActiveDesktop: TGUID = '{75048700-EF1F-11D0-9888-006097DEACF9}'?br>
var

hObj: IUnknown;

ADesktop: IActiveDesktop;

str: string;

wstr: PWideChar;

begin

hObj := CreateComObject(CLSID_ActiveDesktop);

ADesktop := hObj as IActiveDesktop;

wstr := AllocMem(MAX_PATH);

try

StringToWideChar(aFile, wstr, MAX_PATH);

ADesktop.SetWallpaper(wstr, 0);

ADesktop.ApplyChanges(AD_APPLY_ALL or AD_APPLY_FORCE);

finally

FreeMem(wstr);

end;

end;

No comments:

Post a Comment