IE BHO为每个标签加载两次

本文关键字:两次 加载 标签 BHO IE | 更新日期: 2023-09-27 18:05:20

我正在使用这个例子创建IE BHO: http://code.msdn.microsoft.com/CSBrowserHelperObject-c5f3d2f6

我遇到的问题是,对于每个选项卡BHO加载两次。我在BHO构造函数中插入了以下核心:

        Trace.WriteLine("BHO.ctor");
        Trace.WriteLine("Thread: " + Thread.CurrentThread.ManagedThreadId + " of process: " + Process.GetCurrentProcess().Id);
在析构函数:

        Trace.WriteLine("BHO.destructor");
        Trace.WriteLine("Thread: " + Thread.CurrentThread.ManagedThreadId + " of process: " + Process.GetCurrentProcess().Id);

Then in Setsite:

        Trace.WriteLine("Bho.SetSite: " + site);
        Trace.WriteLine("Thread: " + Thread.CurrentThread.ManagedThreadId + " of process: " + Process.GetCurrentProcess().Id);
当我在调试输出中启动IE时,我看到:
[3376] BHO.ctor 
[3376] Thread: 1 of process: 3376 
[3376] Bho.SetSite: System.__ComObject 
[3376] Thread: 1 of process: 3376 
[3376] BHO.ctor 
[3376] Thread: 3 of process: 3376 
[3376] Bho.SetSite: System.__ComObject 
[3376] Thread: 3 of process: 3376

且仅当我关闭它时:

[3376] BHO.destructor 
[3376] Thread: 2 of process: 3376 
[3376] BHO.destructor 
[3376] Thread: 2 of process: 3376 

因此,BHO被加载了两次,并且同时存在两个BHO实例。为什么会发生这种情况?

当我的BHO从第三方程序集订阅事件时,我发现了这个问题,并且我经历了一些奇怪的行为(因为事件有超过1个订阅者)。首先,我认为这是一个第三方库谁导致这个,但现在我从BHO删除了所有额外的代码,所以它基本上什么也不做,但仍然加载两次。

也如果在SetSite我添加OnDocumentComplete处理程序,然后在这个处理程序我写URL调试控制台使用跟踪,我看到第一个线程的URL将是我的页面的实际URL(例如www.google.com)和第二个线程,它将是"约:空白"。如果我再打开一个选项卡做点什么然后切换到第一个选项卡我看到又创建了一个BHO实例(URL: about:blank)

IE BHO为每个标签加载两次

这可能是IE的完整性级别管理。

我想自己解决这个问题。

我正在考虑:

http://blogs.msdn.com/b/ieinternals/archive/2011/08/03/internet-explorer-automation-protected-mode-lcie-default-integrity-level-medium.aspx

第二个似乎在一秒钟后消失了。

您所看到的被称为虚拟制表符,在文档中只简要地提到过。直到最近我们联系了微软技术支持后才意识到这一点——但这些确实是症状(许多"幽灵"导航循环到大约:空白)。

如果您想检测它们(很可能是忽略它们),建议的半官方方法是-

  1. 获取IWebBrowser2接口,
  2. 从其中提取HWND,
  3. 使用IsWindowVisible检查HWND可见性。如果它不可见-它是一个虚拟选项卡。