procedure TForm1.Button1Click(Sender: TObject); var doc,frm: IHTMLDocument2; iw: IWebbrowser2; i: integer; begin doc := WebBrowser1.Document as IHTMLDocument2; for i := 0 to doc.frames.length-1 do begin iw := GetFrame(i); frm := iw.Document as IHTMLDocument2; Memo1.Lines.Add('============== Frame ' + IntToStr(i) +' =================='); Memo1.Lines.Add(frm.body.outerHTML); end; end;function TForm1.GetFrame(FrameNo: Integer): IWebbrowser2; var OleContainer: IOleContainer; enum: IEnumUnknown; unk: IUnknown; Fetched: PLongint; begin while Webbrowser1.ReadyState <> READYSTATE_COMPLETE do Application.ProcessMessages; if Assigned(Webbrowser1.document) then begin Fetched := nil; OleContainer := Webbrowser1.Document as IOleContainer; OleContainer.EnumObjects(OLECONTF_EMBEDDINGS, enum); Enum.Skip(FrameNo); Enum.Next(OLECONTF_EMBEDDINGS, Unk, Fetched); Result := Unk as IWebbrowser2; end else Result := nil; end;
谢谢,但是IOleContainer要调用哪个单元啊?
看看这个方法是不是比较容易理解一些:procedure TMainForm.ToolButton56Click(Sender: TObject); var Index: Integer; Document: IHTMLDocument2; FrameIdx: OleVariant; FrameDis: IDispatch; FrameWin: IHTMLWindow2; begin while Webbrowser1.ReadyState <> READYSTATE_COMPLETE do Application.ProcessMessages; if WebBrowser1.Document = nil then Exit; if WebBrowser1.Document.QueryInterface(IHTMLDocument2, Document) <> 0 then Exit; if Document.frames.length > 0 then begin for Index := 0 to Document.frames.length - 1 do begin FrameIdx := Index; FrameDis := Document.frames.item(FrameIdx); if FrameDis.QueryInterface(IHTMLWindow2, FrameWin) <> 0 then Exit; ShowMessage(FrameWin.document.body.outerHTML); //FrameWin.document 就是你要的每个 Frame 的文档 end; end; end;参考:http://msdn.microsoft.com/library/default.asp?url=/workshop/browser/mshtml/reference/ifaces/document2/onclick.asp
var
doc,frm: IHTMLDocument2;
iw: IWebbrowser2;
i: integer;
begin
doc := WebBrowser1.Document as IHTMLDocument2;
for i := 0 to doc.frames.length-1 do
begin
iw := GetFrame(i);
frm := iw.Document as IHTMLDocument2;
Memo1.Lines.Add('============== Frame ' + IntToStr(i) +' ==================');
Memo1.Lines.Add(frm.body.outerHTML);
end;
end;function TForm1.GetFrame(FrameNo: Integer): IWebbrowser2;
var
OleContainer: IOleContainer;
enum: IEnumUnknown;
unk: IUnknown;
Fetched: PLongint;
begin
while Webbrowser1.ReadyState <> READYSTATE_COMPLETE do
Application.ProcessMessages;
if Assigned(Webbrowser1.document) then
begin
Fetched := nil;
OleContainer := Webbrowser1.Document as IOleContainer;
OleContainer.EnumObjects(OLECONTF_EMBEDDINGS, enum);
Enum.Skip(FrameNo);
Enum.Next(OLECONTF_EMBEDDINGS, Unk, Fetched);
Result := Unk as IWebbrowser2;
end
else
Result := nil;
end;
var
Index: Integer;
Document: IHTMLDocument2;
FrameIdx: OleVariant;
FrameDis: IDispatch;
FrameWin: IHTMLWindow2;
begin
while Webbrowser1.ReadyState <> READYSTATE_COMPLETE do
Application.ProcessMessages; if WebBrowser1.Document = nil then Exit;
if WebBrowser1.Document.QueryInterface(IHTMLDocument2, Document) <> 0 then Exit;
if Document.frames.length > 0 then
begin
for Index := 0 to Document.frames.length - 1 do
begin
FrameIdx := Index;
FrameDis := Document.frames.item(FrameIdx);
if FrameDis.QueryInterface(IHTMLWindow2, FrameWin) <> 0 then Exit;
ShowMessage(FrameWin.document.body.outerHTML);
//FrameWin.document 就是你要的每个 Frame 的文档
end;
end;
end;参考:http://msdn.microsoft.com/library/default.asp?url=/workshop/browser/mshtml/reference/ifaces/document2/onclick.asp
item:IHTMLElement;item.click后.为什么他会跑到webbrowse外面去用IE打开链接?而在IE里打开时他就是在本窗口内打开的!
供参考。至于你上面说的现象,我测试倒是没有问题。
也就是:doc.frames.length=4 //doc:IHTMLDocument2;
那我如何让第三个frame转到一个网页呢?
通常点击一个frame里的链接时,另外一个frame会打开你所点的链接,我要作的就是,不点击,如何让一个frame转到指定的链接.