2014-01-08 69 views
1

我已經使用C++實現了一個IE擴展。它的功能是在網頁的head標籤中注入javascript,只要點擊擴展圖標。我已經使用execScript方法進行腳本注入。
它工作正常,但當我刷新網頁,或者當我點擊網頁上的任何鏈接,或者當我輸入另一個URL時,注入的腳本消失。
我不希望腳本消失,我希望它在Web瀏覽器內持久存在。
我該如何做到這一點?我是新的IE擴展開發,任何幫助將不勝感激。
謝謝。IE擴展插入網頁中的javascript

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); 
    } 
}} 
+0

調用'execScript'總是在頁面加載 – Grundy

+0

腳本獲取只有當我在擴展圖標點擊注入。 – user3173103

+0

@Grundy請看看代碼,並建議您希望我在代碼中添加更改。 – user3173103

回答

1

不要在Exec事件中寫入execScript代碼,請嘗試在OnDocumentComplete方法下添加一段代碼。使用Sink map來設置事件處理。下面提供了一個示例。

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完成事件相似,只有不同的是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

+0

我會試一試,並會讓你知道它是否有效。謝謝你的回覆。 – user3173103

+0

我們能不能在頁面加載之前將腳本注入頁面? – user3173103

+0

我已經更新了答案,看看它是否可以幫助你 – Naddy