BHO仅在第一个IE窗口或标签打开时工作

时间:2014-10-08 17:20:37

标签: c# internet-explorer bho

我一直在阅读并跟进如何使用C#在IE中编写BHO,我可以将其注册并运行但只有在第一个窗口中才能正常工作\ tab我开了。

我知道它的各个方面都会在每个新窗口中触发,但是这些变化并没有“坚持”#34;或者如果他们影响DOM,则申请。因此,举例来说,我加载了一个在页面顶部显示一些文本的页面,它将始终存在于第一个选项卡中,但它可能存在的所有其他页面首先消失或根本不显示。

我使用IE11在Win7x64上使用c#4。保护模式似乎不会影响这种方式。

我的代码只是这里的教程明智的混合,所以没什么特别的。

namespace IEExtention

{     [         标记有ComVisible特性(真),         GUID(" e8483cfd-d208-45f7-837c-3cdca573d84a&#34),         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!!
            }
}

它让我难倒了几天,甚至改变了文件。标题并不总是留下来。

1 个答案:

答案 0 :(得分:0)

我能够通过线程化我的BHO并将其睡眠大约半秒来解决这个问题。有趣的是,我需要将睡眠时间提高到大约1.5秒来处理外部链接(比如来自outlook的内容)以加载并显示所有内容。

我不确定这是否是最好的方法,但它解决了我的问题,只在第一个标签中工作。