您的位置:首页 > 编程语言 > Delphi

delphi使用web桌面的问题

2010-07-23 10:58 267 查看
前一段时间遇到了一个需求,要求要能够在桌面上展示用户需求的图片并能够点击链接展开url链接,使用web桌面是最简单的办法,但是遇到问题,delphi的iactiveDesktop无论如何设置都不能展示,后来网上查了许久资料都没有找到结果,后来终于在一个不起眼的角落发现解决方法,据说是delphi的ShlObj.PAS中_tagCOMPONENT声明有误 = = ! 不敢独享,现与各位分享之,已在delphi2007编译通过:

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:/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;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐