2014-10-08 36 views
1

我一直在閱讀和跟進如何在IE中使用C#編寫BHO,我可以註冊它並且運行它,但它只能在第一個時正常工作窗口\標籤我已經打開。BHO只在第一個IE窗口或標籤打開

我知道它的各個方面在每個新窗口中都會觸發,但如果它們影響DOM,這些更改不會「粘」或應用。因此,例如,我加載了一個頁面,該頁面在頁面頂部顯示一些文本,它將始終在第一個選項卡中,但其中可能存在的所有其他文件首先會消失或根本不顯示。

我在使用IE11的Win7x64上使用c#4。保護模式似乎不會影響這種或那種方式。

我的代碼只是這裏教程明智的一個組合,所以沒有什麼奇特。

namespace IEExtention 

{ [ 標記有ComVisible特性(真), 的Guid( 「e8483cfd-d208-45f7-837c-3cdca573d84a」), ClassInterface(ClassInterfaceType.None) ]

public class BHO : IObjectWithSite 
{ 
    private WebBrowser webBrowser; 
    private static readonly ILog log = LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); 
    private object mySite; 

    public int SetSite(object site) 
    { 
     if (site != null) 
     { 
      mySite = site; 
      webBrowser = (WebBrowser)site; 
      webBrowser.DocumentComplete += 
       new DWebBrowserEvents2_DocumentCompleteEventHandler(
       this.OnDocumentComplete); 
     } 
     else 
     { 
      webBrowser.DocumentComplete -= 
       new DWebBrowserEvents2_DocumentCompleteEventHandler(
       this.OnDocumentComplete); 
      webBrowser = null; 
     } 

     return 0; 


    } 

    public int GetSite(ref Guid guid, out IntPtr ppvSite) 
    { 
     IntPtr punk = Marshal.GetIUnknownForObject(webBrowser); 
     int hr = Marshal.QueryInterface(punk, ref guid, out ppvSite); 
     Marshal.Release(punk); 
     return hr; 
    } 

public void OnDocumentComplete(object pDisp, ref object URL) 
    { 
     log.Debug("test"); 
     if (pDisp != mySite) 
     { 
      return; 
     } 
HTMLDocument document = (HTMLDocument)this.webBrowser.Document; 
      document.title = "Hello, StackOverflow!"; 
      try 
      { 
       IHTMLDOMNode greetings = document.createTextNode("Hi there!"); 

       IHTMLDOMNode body = document.body as IHTMLDOMNode; 
       body.insertBefore(greetings, body.firstChild); 
      } 
      catch (Exception e) 
      { 
       //whoo!! 
      } 
} 

它有我甚至爲了改變document.title並不總是會留下來,而是爲了這幾天而難過。

回答

0

我能夠解決這個問題,通過線程我的BHO和睡覺大約半秒鐘。有趣的是,我需要將睡眠時間調整到大約1.5秒,以處理外部鏈接(例如來自Outlook的某些內容)以加載並顯示所有內容。

我不確定這是否是最好的方法,但它解決了我的問題,只能在第一個選項卡中工作。

相關問題