如何在Chrome浏览器中获取IHtmlDocument2?

时间:2013-04-18 02:29:08

标签: google-chrome chromium ihtmldocument2

在Internet Explorer中,我可以使用IHtmlDocument2来获取html文档。

function GetCurrentBrowserDOM: WideString;
var
  hr: HRESULT;
  CurrentIE: IWebbrowser2;
  Wnd: HWND;
  WndChild:HWND;
  document: IDispatch;
  RootNode: IHTMLDocument2;
  innerHtml: WideString;
begin
  Result := '';
  Wnd := GetForegroundWindow;
  WndChild := FindWindowEx(Wnd, 0,'Frame Tab', nil);
  WndChild := FindWindowEx(WndChild, 0,'TabWindowClass', nil);
  WndChild := FindWindowEX(WndChild, 0, 'Shell DocObject View', nil);
  WndChild := FindWindowEX(WndChild, 0, 'Internet Explorer_Server', nil);//find Internet
  CoInitialize(nil);
  try
    hr := GetIEFromHWND(WndChild, CurrentIE);
    if hr = S_OK then
    begin
      document := CurrentIE.Document;
      document.QueryInterface(IID_IHTMLDocument2, RootNode);
      innerHtml := RootNode.body.innerHTML;
    end;
  finally
    CoUninitialize;
  end;
end;

function GetIEFromHWND(WHandle: HWND; var IE: IWebbrowser2): HRESULT;
type
  TObjectFromLResult = function(LRESULT: LRESULT; const IID: TGUID; wParam: WPARAM; out PObject): HRESULT; stdcall;
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);
      Result := GetLastError;
      if Result = S_OK then
        (pDoc.parentWindow as IServiceprovider).QueryService(IWebbrowserApp, IWebbrowser2, IE);
    finally
      FreeLibrary(hInst);
    end;
end;

我使用spy ++来查找chrome框架手柄,然后找到了它们。

  Wnd := GetForegroundWindow;
  WndChild := FindWindowEx(Wnd, 0, 'Chrome_WidgetWin_0', nil);
  WndChild := FindWindowEx(WndChild, 0, 'Chrome_RenderWidgetHostHWND', nil);
  WndChild := FindWindowEx(WndChild, 0, 'CompositorHostWindowClass', nil);

但它无法捕获名为ObjectFromLresult的函数中的结果。

ObjectFromLresult(lRes, IHTMLDocument2, 0, pDoc);

我得到的错误代码是127。

这是否意味着Chrome浏览器不支持这种方式来获取其html文档?

如果答案是肯定的,还有另一种方法可以捕捉它吗?

非常感谢。

PS:我曾尝试使用MSAA树,但它也没有用。(只能获取标题)

1 个答案:

答案 0 :(得分:3)

这是不可能的,IHtmlDocument2仅在IE托管对象中支持接口,Chrome中使用的WebKit引擎不支持它。但是,您可以使用MSAA访问元素,但您需要先启用辅助功能:http://www.chromium.org/developers/design-documents/accessibility

或者您可以通过远程调试协议访问DOM:https://developers.google.com/chrome-developer-tools/docs/protocol/1.0/index