代码如下:compDesktopItem:TShComponent;
  iad : IActiveDesktop;
  strFileName:WideString;
  i:integer;
begin  
  compDesktopItem.dwSize:=SizeOf(compDesktopItem);
  strFileName := 'http://www.baidu.com';
  iad:=CreateComObject(CLSID_ActiveDesktop) As IActiveDesktop;
//iad.SetWallpaper(pachar('c:\temp.jpg'),0);
  i:=iad.AddUrl(0,PWideChar(strFileName),compDesktopItem,ADDURL_SILENT);//返回的不是OK
  iad.ApplyChanges(AD_APPLY_ALL);
end;
然后发现设置web桌面返回的不是OK,而且也没有设置成功
但是如果设置墙纸,能成功。求达人指点问题在哪里?PS:我发现很多里面使用 CoCreateInstance(CLSID_ActiveDesktop,IntPtr.Zero, CLSCTX_INPROC_SERVER,IID_IActiveDesktop, ActiveDesktop)来创建active Desktop,但是我用这段代码的时候会发现IID_IActiveDesktop未定义,所以就用的iad:=CreateComObject(CLSID_ActiveDesktop) As IActiveDesktop,会是这里的问题吗?

解决方案 »

  1.   


    var
      fileName:string;
      ad : IActiveDesktop;
      di : TShComponent;
      hr : HRESULT;
      co : TComponentsOpt;
      cp : TCompPos;
      ItemName : WideString;
      ItemURL : WideString;
      ItemCount : Integer;
      I : Integer;
    begin
      //activeDesktop进行web桌面处理
      ad := CreateComObject(CLSID_ActiveDesktop) as IActiveDesktop;//创建
      ZeroMemory(@co, SizeOf(co));
      co.dwSize := SizeOf(co);
      hr := ad.GetDesktopItemOptions(co, 0);//取得当前activeDesktop状态
    //  if hr <> S_OK then
    //    Memo1.Lines.Add(SysErrorMessage(HResultCode(hr)));
      if not co.fActiveDesktop or not co.fEnableComponents then//未启用状态则开启
      begin
        co.dwSize := SizeOf(co);
        co.fEnableComponents := True;
        co.fActiveDesktop := True;
        hr := ad.SetDesktopItemOptions(co, 0);
    //    if hr <> S_OK then
    //      Memo1.Lines.Add(SysErrorMessage(HResultCode(hr)));
    //    hr := ad.ApplyChanges(AD_APPLY_ALL);
    //    if hr <> S_OK then
    //      Memo1.Lines.Add(SysErrorMessage(HResultCode(hr)));
      end;
      ZeroMemory(@cp, SizeOf(cp));
      cp.dwSize := SizeOf(cp);//设置web桌面大小
      cp.dwWidth := 1024;     //宽度,重要属性
      cp.dwHeight := 768;     //高度,重要属性
      cp.fCanResize := True;  //是否可重绘
      ZeroMemory(@di, SizeOf(di));
      di.dwSize := SizeOf(di);
      di.dwID := 0;           //必须为0
      di.fDirty := False;
      di.fChecked := True;
      di.fNoscroll := True;   //是否允许滚动条
      di.iComponentType := COMP_TYPE_WEBSITE;//类别
      di.fChecked := True;
      di.cpPos := cp;         //将设定好的大小传过来
      ItemName := '桌面项';   //名称,该名称可以在桌面->自定义桌面->web中看到
      ItemURL:='http://www.baidu.com'; //url链接,重要属性,可设置本地web文件
    //  ItemURL := 'D:\工程文件之类的东西\进销存shop\NewShoppe\web\stock.htm';
      Move(ItemName[1], di.wszFriendlyName, Length(ItemName)*SizeOf(WideChar));
      Move(ItemURL[1], di.wszSource, Length(ItemURL)*SizeOf(WideChar));
      hr := ad.AddDesktopItem(di, 0);
      hr := ad.ApplyChanges(AD_APPLY_ALL);//刷新//下面这一段代码是获取当前生效的web桌面的
    //  hr := ad.GetDesktopItemCount(ItemCount,0);
    //  for I := 0 to ItemCount - 1 do
    //  begin
    //    ZeroMemory(@di, SizeOf(di));
    //    di.dwSize := SizeOf(di);
    //    hr := ad.GetDesktopItem(I, di, 0);
    //    if hr <> S_OK then
    //    begin
    //      Memo1.Lines.Add(SysErrorMessage(HResultCode(hr)));
    //    end
    //    else
    //      Memo1.Lines.Add(di.wszFriendlyName + '->' + di.wszSource);
    //  end; 
    end;需要注意的是用这段代码时别忘了把ShlObj.PAS中的声明改一下,这里有一个技巧,把ShlObj.PAS 考到工程目录再改,可以不影响原有的,然后编译就行了,据说是delphi的ShlObj.PAS声明有误,需要修改的地方如下_tagCOMPONENT = packed record
      dwSize: DWORD; // Size of this structure
      dwID: DWORD; // Reserved: Set it always to zero.
      iComponentType: Integer; // One of COMP_TYPE_*
      fChecked: BOOL; // Is this component enabled?
      fDirty: BOOL; // Had the component been modified and not yet saved to disk?
      fNoScroll: BOOL; // Is the component scrollable?
      cpPos: TCompPos; // Width, height etc.,
      wszFriendlyName: array[0..MAX_PATH-1] of WideChar; // Friendly name of component.
      wszSource: array[0..2083] of WideChar; //URL of the component.主要就是这两个不同
      wszSubscribedURL:  array[0..2083] of WideChar; //Subscrined URL主要就是这两个不同
      end;