我使用EmbeddedEB来开发一个浏览器,现在其它的功能都实现了,可是发现一个问题。
我自己编写了一个收藏夹的界面,我想当使用EmbeddedEB显示出页面以后,当用户点击右键菜单中的“添加到收藏夹”时,调用我的这个收藏夹界面来,可是试了好多次,依然调用的是IE自己的收藏夹界面。我试着在showcontextmenu中进行自定义菜单编写,可是发现需要书写大量的菜单功能。请问如何实现我说的功能呢?
我自己编写了一个收藏夹的界面,我想当使用EmbeddedEB显示出页面以后,当用户点击右键菜单中的“添加到收藏夹”时,调用我的这个收藏夹界面来,可是试了好多次,依然调用的是IE自己的收藏夹界面。我试着在showcontextmenu中进行自定义菜单编写,可是发现需要书写大量的菜单功能。请问如何实现我说的功能呢?
解决方案 »
- [高手进]问个FileExists的问题
- 求具有某些Browser/Server方式特征的C/S方式的实现方法
- 李维力作《Inside VCL》隆重上市!—剖析VCL之精妙大架构!
- 急急 求一算法
- 对 cg1120(代码最优化-§雨后看见彩虹……§)的代码的问题,大家帮看一下.
- delphi的对象库怎么调出来?delphi 7
- 为什么在DBGRID中用INSERT命令输入记录后记录会追加到数据集的最后?
- 如何去掉shell得系统右键菜单,换成自己得popupmenu?
- 如何使MEMO的SCROLLBAR变为FLAT风格,以及响应MOUSE的ENTER,EXIT事件???
- 各位在客户处开发程序时,用什么方法保证源程序不外流的?gz者有分
- DELPHIXE2
- 关于tlistview自绘和spy4win的问题,能否勾引出来ccrun哪?
CLSID_ShellUIHelper: TGUID = '{64AB4BB7-111E-11D1-8F79-00C04FC2FBE1}'; var
p:procedure(Handle: THandle; Path: PChar); stdcall; procedure TForm1.OrganizeFavorite(Sender: Tobject);
var
H: HWnd;
begin
H := LoadLibrary(PChar('shdocvw.dll'));
if H <> 0 then
begin
p := GetProcAddress(H, PChar('DoOrganizeFavDlg'));
if Assigned(p) then p(Application.Handle, PChar(FavFolder));
end;
FreeLibrary(h);
end;
procedure TForm1.AddFavorite(Sender: TObject);
var
ShellUIHelper: ISHellUIHelper;
url, title: Olevariant;
begin
Title := Webbrowser1.LocationName;
Url := Webbrowser1.LocationUrl;
if Url <> '' then
begin
ShellUIHelper := CreateComObject(CLSID_SHELLUIHELPER) as IShellUIHelper;
ShellUIHelper.AddFavorite(url, title);
end;
end; 用上面的通过ISHellUIHelper接口来打开“添加到收藏夹”对话框的方法比较简单,但是有个缺陷,就是打开的窗口不是模式窗口,而是独立于应用程序的。可以想象,如果使用与OrganizeFavorite过程同样的方法来打开对话框,由于可以指定父窗口的句柄,自然可以实现模式窗口(效果与在资源管理器和IE中打开“添加到收藏夹”对话框相同)。问题显然是这样的,上面两个过程的作者当时只知道shdocvw.dll中DoOrganizeFavDlg的原型而不知道DoAddToFavDlg的原型,所以只好用ISHellUIHelper接口来实现(或许是他不够严谨,认为是否是模式窗口无所谓?)。
下面的过程就告诉你DoAddToFavDlg的函数原型。需要注意的是,这样打开的对话框并不执行“添加到收藏夹”的操作,它只是告诉应用程序用户是否选择了“确定”,同时在DoAddToFavDlg的第二个参数中返回用户希望放置Internet快捷方式的路径,建立.Url文件的工作由应用程序自己来完成。 procedure TForm1.AddFavorite(IE: TEmbeddedWB);
procedure CreateUrl(AUrlPath, AUrl: PChar);
var
URLfile: TIniFile;
begin
URLfile := TIniFile.Create(String(AUrlPath));
RLfile.WriteString('InternetShortcut', 'URL', String(AUrl));
RLfile.Free;
end;
var
AddFav: function(Handle: THandle;
UrlPath: PChar; UrlPathSize: Cardinal;
Title: PChar; TitleSize: Cardinal;
FavIDLIST: pItemIDList): Bool; stdcall;
FDoc: IHTMLDocument2;
UrlPath, url, title: array[0..MAX_PATH] of char;
H: HWnd;
pidl: pItemIDList;
FRetOK: Bool;
begin
FDoc := IHTMLDocument2(IE.Document);
if FDoc = nil then exit;
StrPCopy(Title, FDoc.Get_title);
StrPCopy(url, FDoc.Get_url);
if Url <> '' then
begin
H := LoadLibrary(PChar('shdocvw.dll'));
if H <> 0 then
begin
SHGetSpecialFolderLocation(0, CSIDL_FAVORITES, pidl);
AddFav := GetProcAddress(H, PChar('DoAddToFavDlg'));
if Assigned(AddFav) then
FRetOK :=AddFav(Handle, UrlPath, Sizeof(UrlPath), Title, Sizeof(Title), pidl)
end;
FreeLibrary(h);
if FRetOK then
CreateUrl(UrlPath, Url);
end
end;
//----------------------------------------------------------------
我写过一些webbrowser的应用,但是没有用到过收藏夹。不过我不明白你为什么要写那么多功能,如果自己添加的话,只要把这些地址和名称存上就可以了。
我没有试过,我猜想的啊。
要加入新浪,那么存入文本字符串:
新浪=http//www.sina.com.cn
需要的时候载入,用name和valueofindex取出来就可以了。
你处理这个消息,给IE自己的收藏夹界面发送WM_CLOSE消息用来关闭它,然后弹出你自己的界面!!!
当然,其他IE的界面弹出时(比如右键“属性”),也是有WM_ACTIVATE消息的,所以你得判断当前弹出的IE的界面是不是收藏夹的!!!