我因为无聊,所以写个定时更新墙纸的小东东,
可网上广为流传的两种方式都没用,至少不能立即更新。下面贴出代码,希望大家指正:1:
procedure setwallpaper(fileName:String);
var
  Reg:Tregistry;
begin
  Reg:=Tregistry.Create;
  Reg.RootKey:=HKey_Current_User;
  Reg.OpenKey('Control Panel\Desktop',False);
  Reg.WriteString('TileWallPaper','0');//改为('TileWallPaper','1')平铺
  Reg.WriteString('WallPaper',fileName);
  SystemParametersInfo(SPI_SETDESKWALLPAPER,0,nil,SPIF_SendChange);
  Reg.CloseKey;
  Reg.Free;
end;2:
procedure setwallpaper(fileName:String);
begin
  {调用API函数SystemParametersInfo来设置桌面墙纸的图片文件为'c:\windows\mywallpaper.bmp'}
  SystemParametersInfo(SPI_SETDESKWALLPAPER, 0,Pchar(fileName), SPIF_UPDATEINIFILE);
end;

解决方案 »

  1.   

    SystemParametersInfo这个函数在2000下是无效的,只能在9x下才有用
      

  2.   

    uses
      ShlObj, ComObj;
    function ChangeWallpaper(aFile: String): Boolean;
    const
      CLSID_ActiveDesktop: TGUID = '{75048700-EF1F-11D0-9888-006097DEACF9}';
    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;
      

  3.   

    太好了,非常感谢aiirii(ari-爱的眼睛)