gpt4 book ai didi

google-chrome - 如何在 chrome 浏览器中获取 IHtmlDocument2?

转载 作者:行者123 更新时间:2023-12-04 05:01:50 25 4
gpt4 key购买 nike

在 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 框架 handle ,我找到了它们。
  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树,但也没有用。(只能获取标题)

最佳答案

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

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

关于google-chrome - 如何在 chrome 浏览器中获取 IHtmlDocument2?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16073532/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com