【问题标题】:How can I get IHtmlDocument2 in chrome browser?如何在 chrome 浏览器中获取 IHtmlDocument2?
【发布时间】:2013-04-18 02:29:08
【问题描述】:

在 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树,但也没有用。(只能获取标题)

【问题讨论】:

    标签: google-chrome chromium ihtmldocument2


    【解决方案1】:

    这是不可能的,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

    【讨论】:

      猜你喜欢
      • 2023-03-28
      • 1970-01-01
      • 2014-04-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-02
      • 1970-01-01
      相关资源
      最近更新 更多