代码如下: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,会是这里的问题吗?
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,会是这里的问题吗?
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;