IE扩展在网页中注入javascript

时间:2014-01-08 12:03:45

标签: javascript c++ internet-explorer code-injection

我使用C ++实现了IE扩展。它的功能是在点击扩展图标时在网页的head标签中注入javascript。我使用execScript方法进行脚本注入 它工作正常,但是当我刷新网页,或者当我点击网页上的任何链接,或者当我输入另一个URL时,注入的脚本就会消失。
我不希望脚本消失,我希望它在Web浏览器中持久存在 我怎样才能做到这一点?我是IE扩展开发的新手,任何帮助都将受到高度赞赏 感谢。

STDMETHODIMP CBlogUrlSnaggerAddIn::Exec(
const GUID *pguidCmdGroup, DWORD nCmdID,
DWORD nCmdExecOpt, VARIANTARG *pvaIn, VARIANTARG *pvaOut){
    HRESULT hr = S_OK;
    CComPtr<IDispatch> spDispDoc;
    hr = m_spWebBrowser->get_Document(&spDispDoc);
    if (SUCCEEDED(hr)){ 
        CComPtr<IDispatch> spDispDoc;
        hr = m_spWebBrowser->get_Document(&spDispDoc);
           if (SUCCEEDED(hr) && spDispDoc){
              CComPtr<IHTMLDocument2> spHTMLDoc;
              hr = spDispDoc.QueryInterface<IHTMLDocument2>( &spHTMLDoc );
                  if (SUCCEEDED(hr) && spHTMLDoc){
                       VARIANT vrt = {0};
                       CComQIPtr<IHTMLWindow2> win;
                       hr = spHTMLDoc->get_parentWindow(&win);
                       CComBSTR bstrScript = L"function fn() {alert('helloooo');}var  head = document.getElementsByTagName('head')[0],script = document.createElement('script');script[script.innerText ? 'innerText' : 'textContent'] = '(' + fn + ')()';head.appendChild(script);head.parentNode.replaceChild(script,'script');";
                       CComBSTR bstrLanguage = L"javascript";
                       HRESULT hrexec = win->execScript(bstrScript,bstrLanguage, &vrt);
    }
}}

1 个答案:

答案 0 :(得分:1)

不要在Exec事件中编写execScript代码,而是尝试在OnDocumentComplete方法下添加一段代码。使用用于设置事件处理的接收器映射。下面提供了一个样本。

BEGIN_SINK_MAP(CMyClass)
    SINK_ENTRY_EX(1, DIID_DWebBrowserEvents2,DISPID_DOCUMENTCOMPLETE , OnDocumentComplete)

END_SINK_MAP()

在类文件中实现DocumentComplete。

void STDMETHODCALLTYPE CMyClass::OnDocumentComplete(IDispatch *pDisp,VARIANT *pvarURL)
{
   //Inject the scripts here
}

已更新:

我没有试过这个,但我想DownloadBegin事件会满足你的需要。它类似于Document complete事件映射,只有不同的东西是DISPID_DOWNLOADBEGIN。将相应的处理程序方法映射到DISPID并尝试一下。

BEGIN_SINK_MAP(CMyClass)
    SINK_ENTRY_EX(1,DIID_DWebBrowserEvents2,DISPID_DOWNLOADBEGIN, OnDocumentLoad)
END_SINK_MAP()

与DocumentComplete Handler方法类似

void STDMETHODCALLTYPE CMyClass::OnDocumentLoad(IDispatch *pDisp,VARIANT *pvarURL)
{
   //Inject scripts here
}
  

http://msdn.microsoft.com/en-us/library/cc136547(v=vs.85).aspx