2

在 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++ 寻找镀铬框架手柄,我找到了它们。

  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树,但它也不起作用。(只能获取标题)

4

1 回答 1

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

于 2013-05-24T15:04:24.347 回答