IE 扩展,用于在网页中注入 JavaScript

IE extension to inject javascript in the webpage

本文关键字:注入 JavaScript 网页 扩展 用于 IE      更新时间:2023-10-16

我已经使用C++实现了IE扩展。它的功能是每当单击扩展图标时,都会在网页的头部标签中注入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);
    }
}}
不要在

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

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

在类文件中实现文档完成。

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

更新:

我还没有尝试过这个,但我想 下载开始 事件会满足您的目的。它类似于映射的文档完成事件,唯一不同的是DISPID_DOWNLOADBEGIN。将相应的处理程序方法映射到 DISPID 并尝试一下。

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

类似于文档完成处理程序方法

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

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