在Delphi中设置墙纸及相关属性

Author: 陈翀伟 Date: 2000年 第23期

  目前,已有不少的文章介绍了在Delphi中通过调用Win32 API函数SystemParametersInfo来动态设置Windows系统墙纸的方法。具体如下:
  SystemParametersInfo(SPI_SETDESKWALLPAPER, 0, FileName, SPIF_UPDATEINIFILE Or SPIF_SENDWININICHANGE);
  其中, FileName是墙纸文件名(包含全路径)。
  这种方法的缺点在于仅能设置墙纸的内容,而无法将墙纸以“居中”,“平铺”和“拉伸”等不同方式显示出来。下面我将介绍如何通过直接修改Windows系统注册表来实现上述显示效果。
  在系统注册表中,主键Desktop(注册表路径为HKEY_CURRENT_USER\Control Panel\Desktop)中包含与墙纸有关的几个项值。
  其中,项值TileWallpaper用以控制墙纸是否以“平铺”方式显示。当其值为1时,以“平铺”方式显示。而当其值为0时,则以非“平铺”方式显示。
  项值WallPaperStyle用以控制墙纸是否以“拉伸”方式显示。当其值为2时,以“拉伸”方式显示。而当其值为0时,则以非“拉伸”方式显示。
  项值WallPaper中存放墙纸文件名(包含全路径)。
  因此,只需通过正确设置上述项值,就可设置相应的墙纸的属性,此后再调用SystemParametersInfo(SPI_SETDESKWALLPAPER,0,nil,SPIF_SENDCHANGE)将注册表更新的消息进行广播即可使设置立即生效。
  下面代码举例说明如何将“C:\A.BMP”设置为当前墙纸,并以“平铺”的方式显示出来。
  procedure SetTitledWallPaper;
  var
  Registry: TRegistry;
  begin
  // 设置墙纸的属性
  Registry := TRegistry.Create;
  try
  if Registry.OpenKey(′Control Panel\DeskTop′, False) then
  begin
  Registry.WriteString(′TileWallPaper′, ′1′); // 平铺方式,TileWallPaper为1
  Registry.WriteString(′WallPaperStyle′, ′0′); // 非拉伸方式,WallPaperStyle为0
  Registry.WriteString(′WallPaper′, ′C:\A.BMP′); // 墙纸文件的路径″C:\A.BMP″
  end;
  Registry.CloseKey;
  finally
  Registry.Free;
  end;
  //广播注册表改动的消息
  SystemParametersInfo(SPI_SETDESKWALLPAPER, 0, nil, SPIF_SENDCHANGE);
  end;