[Delphi]怎样访问Internet Explorer中的WebBrowser?

下面就是一个例子展示如何从打开的Internet Explorer中取得其网页元素的HTML源代码:


const

RSPSIMPLESERVICE = 1;

RSPUNREGISTERSERVICE = 0;

type

TObjectFromLResult = function(LRESULT: lResult; const IID: TIID; WPARAM: wParam; out pObject): HRESULT; stdcall;

function GetIEFromHWND(WHandle: HWND; var IE: IWebbrowser2): HRESULT;

var

hInst: HWND;

lRes: Cardinal;

MSG: Integer;

pDoc: IHTMLDocument2;

ObjectFromLresult: TObjectFromLresult;

begin

hInst := LoadLibrary('Oleacc.dll');

@ObjectFromLresult := GetProcAddress(hInst, 'ObjectFromLresult');

if @ObjectFromLresult <> nil then

begin

try

MSG := RegisterWindowMessage('WM_HTML_GETOBJECT');

SendMessageTimeOut(WHandle, MSG, 0, 0, SMTO_ABORTIFHUNG, 1000, lRes);

Result := ObjectFromLresult(lRes, IHTMLDocument2, 0, pDoc);

if Result = S_OK then

(pDoc.parentWindow as IServiceprovider).QueryService(IWebbrowserApp, IWebbrowser2, IE);

finally

FreeLibrary(hInst);

end;

end;

end;

procedure TForm1.Button1Click(Sender: TObject);

var

All: IHtmlElementCollection;

HtmlElement: IHtmlElement;

I: Integer;

Document: IHtmlDocument2;

IE: IWebBrowser2;

Wnd: HWND;

WndChild: HWND;

begin

Wnd := FindWindow('IEFrame', nil);

if Wnd = 0 then

begin

MessageDlg('No Running instance of Internet Explorer!', mtError, [mbOK], 0);

end;

// walk Shell DocObject View->Internet Explorer_Server

WndChild := FindWindowEX(Wnd, 0, 'Shell DocObject View', nil);

if WndChild <> 0 then

begin

WndChild := FindWindowEX(WndChild, 0, 'Internet Explorer_Server', nil);

if WndChild <> 0 then

begin

GetIEFromHWnd(WndChild, IE); //Get Iwebbrowser2 from Handle

Document := IE.Document as IHtmlDocument2;

if Assigned(Document) then

begin

All := Document.All;

for I := 0 to All.Length - 1 do

begin

HtmlElement := All.item(i, 0) as IhtmlElement;

SourceView.Lines.Add(IntToStr(i) + ' ' + HTmlElement.innerHTML);

end;

end;

end;

end;

end;