IE扩展在网页中插入JavaScript(IE extension to inject javasc

2019-09-28 02:12发布

我已经实现使用C ++的IE扩展。 它的功能是注入的JavaScript在网页的head标签,只要单击扩展图标。 我已经使用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);
    }
}}

Answer 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事件将成为你的目的。 它类似于这将不同将是DISPID_DOWNLOADBEGIN的文档完整的事件映射,唯一的事情。 地图相应的处理方法的DISPID,并给它一试。

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

类似的DocumentComplete处理方法

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

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



文章来源: IE extension to inject javascript in the webpage