C # — BHO Выполнить JavaScript на каждой странице

Я пишу расширение для Internet Explorer (BHO).
Я прочитал много вопросов, ответов, но не могу найти и понять, как заставить файл Javascript выполнять с ресурса на каждой странице? Не добавлять веб-страницу, нужно обязательно выполнить JS на каждой странице.

Я знаю, что мне нужно сделать выполнить после OnDocumentComplete, но я не могу знать, как это сделать в C ++ …
Я нашел это расширение, но оно написано на C #, и я не могу преобразовать его в C ++ .:

https://github.com/dvdotsenko/livereload_ie_extension

У меня есть пример BHO в C ++:
http://www.codeproject.com/Articles/37044/Writing-a-BHO-in-Plain-C

Можете ли вы помочь мне добавить исполняемый JavaScript из ресурса на каждую страницу?

0

Решение

Ты ищешь IHTMLWindow2 :: execScript.

Вы можете получить IHTMLDocument2 указатель, выполнив следующее:

  1. Вызов IWebBrowser2::get_Document(),
  2. QueryInterface () результирующий IDispatch указатель для IID_IHTMLDocument2,

Вы должны быть в состоянии получить указатель IHTMLWindow2, вызвав get_parentWindow на IHTMLDocument2 возражать и делать похожий танец.

Вот несколько примеров функций. Вы должны реализовать IObjectWithSite и кешировать указатель вашего сайта. Вы можете передать это этим функциям.

HRESULT Web2FromSite(IUnknown *punkSite, IWebBrowser2 **pWeb2) {
IServiceProvider* psp;
HRESULT hr = punkSite->QueryInterface(IID_IServiceProvider, (void **)&psp);
if (SUCCEEDED(hr))
{
hr = psp->QueryService(SID_SWebBrowserApp, IID_IWebBrowser2, (void **)pWeb2);
psp->Release();
}
return hr;
}

HRESULT Doc2FromWeb2(IWebBrowser2 *pWeb2, IHTMLDocument2 **ppDoc2) {
CComPtr<IDispatch> spDisp;
HRESULT hr = pWeb2->get_Document(&spDisp);
if (SUCCEEDED(hr) && spDisp)
{
hr = spDisp->QueryInterface(IID_IHTMLDocument2, (void**)ppDoc2);
} else {
hr = E_FAIL;
}
return hr;
}

HRESULT Doc2FromSite(IUnknown *punkSite, IHTMLDocument2 **ppDoc2) {
CComPtr<IWebBrowser2> spWeb2;
HRESULT hr = Web2FromSite(punkSite, &spWeb2);
if (SUCCEEDED(hr)) {
hr = Doc2FromWeb2(spWeb2, ppDoc2);
}
return hr;
}
1

Другие решения

Здесь я предполагаю, что у вас уже есть работающий BHO и он обрабатывает OnDocumentComplete. Я также предполагаю, что при обработке OnDocumentComplete вы получите указатель на интерфейс IWebBrowser2. Дайте мне знать, если это не так.

предупреждение: ошибка проверки «перфекция».

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;

}
0