BHO在每个页面上执行JavaScript

时间:2013-10-04 16:25:39

标签: c# c++ internet-explorer bho

我正在为Internet Explorer(BHO)编写扩展程序。 我读了很多问题,答案,但无法找到和理解,如何从每个页面上的资源执行Javascript文件?不附加网页,需要在每个页面上执行JS。

我知道,我需要在OnDocumentComplete之后执行make,但我不知道,这在C ++中是怎么做的...... 我找到了这个扩展,但它是用C#编写的,我无法将其转换为C ++:

https://github.com/dvdotsenko/livereload_ie_extension

我在C ++中有一个示例BHO: http://www.codeproject.com/Articles/37044/Writing-a-BHO-in-Plain-C

您能帮助我在每个页面上从资源添加执行JavaScript吗?

2 个答案:

答案 0 :(得分:1)

您正在寻找IHTMLWindow2::execScript

您可以通过执行以下操作获取IHTMLDocument2指针:

  1. 致电IWebBrowser2::get_Document()
  2. QueryInterface()生成IDispatch的{​​{1}}指针。
  3. 您应该能够通过调用IID_IHTMLDocument2对象上的get_parentWindow并进行类似的舞蹈来获取IHTMLWindow2指针。

    以下是一些示例函数。您必须实现IHTMLDocument2并缓存您的站点指针。您可以将其传递给这些函数。

    IObjectWithSite

答案 1 :(得分:0)

我想这里你已经有一个正在运行的BHO并且它处理OnDocumentComplete。我还假设您对OnDocumentComplete的处理为您提供了一个IWebBrowser2接口指针。如果情况不是这样,请告诉我。

警告:错误检查“perfectible”。

HRESULT ExecScriptOnDocComplete(  CComPtr<IWebBrowser2> & spIWebBrowser2, BSTR bstrScriptToExec ) {

    // get the IHTMLDocument2
    CComPtr<IDispatch> spIDispatchDocument;
    HRESULT hr = spIWebBrowser2->get_Document( &spIDispatchDocument );
    if ( FAILED( hr ) ) return hr;
    CComPtr<IHTMLDocument2> spIHTMLDocument2;
    hr = spIDispatchDocument.QueryInterface<IHTMLDocument2>( &spIHTMLDocument2 );
    if ( FAILED( hr ) ) return hr;

    // get the IHTMLWindow2
    CComPtr<IHTMLWindow2> spIHTMLWindow2;
    hr = spIHTMLDocument2->get_parentWindow( &spIHTMLWindow2 );
    if ( FAILED( hr ) ) return hr;

    // Execute the script
    CComVariant ccomvariantRetVal;
    hr = spIHTMLWindow2->execScript( bstrScriptToExec, CComBSTR( L"JavaScript" ), &ccomvariantRetVal );

    return hr;

}