2013-04-18 847 views
2

在Internet Explorer中,我可以使用IHtmlDocument2來獲取html文檔。如何在Chrome瀏覽器中獲取IHtmlDocument2?

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樹,但它沒有工作過(只能取標題)

回答