Triyng 编写一个 BHO 以将 iFrame 注入用户访问的每个网页,使用各种侦听器,导致循环并且没有 ifram



所以不幸的是,我被困在为Internet Explorer编写BHO上。它的功能是将iframe注入用户访问的每个网页中,在用户开展业务时显示一些(相对(恒定的信息。我已经通过一系列相当笨拙的mshtml强制转换来管理注入,如下所示,其中资源管理器是一个WebBrowserClass对象,foo.html提供了BHO的源代码:

IHTMLDocument2 document = (IHTMLDocument2) Explorer.Document;
IHTMLDocument3 doc3 = (IHTMLDocument3)document;
var iframe = document.createElement("iframe");
iframe.setAttribute("src", "foo.html");
iframe.setAttribute("id", "iFrame");
iframe.setAttribute("style", "position: fixed; left: 0px; top: 0px; border: 0px; width: 100%; height: 45px; background-color: white");
IHTMLElementCollection iec = doc3.getElementsByTagName("body");
IHTMLElement elem = (IHTMLElement)iec.item(0);
IHTMLDOMNode domnode = (IHTMLDOMNode)elem;
domnode.appendChild((IHTMLDOMNode)iframe);

这行得通!我认为。有点。如果我将其粘贴在OnDocumentComplete中,则会导致无限循环,并且无论哪种方式都不会显示任何iframe。循环的问题是使用资源管理器的事件侦听器,如 OnDocumentComplete,因为每当 iFrame 中的页面完成加载时,它们就会被调用,然后调用注入函数,然后调用 OnDocumentComplete,这...好吧,你明白了。我尝试过使用 OnNavigateComplete,但它最终仍然会在从多个来源加载的页面上多次加载(例如,启用了自动完成功能的 google 主搜索页面(。但即使它没有进入无限循环,我仍然不会得到一个可见的 iframe。

所以我想这是两个问题:1( 如何实际显示我的 iframe?注入代码有效(我已经尝试过使用简单的 javascript 警报(...2( 如何让我的 iframe 在用户每次导航到新页面或刷新当前页面时都显示,而不会导致 BHO 进入无限循环?

其他可能相关的功能:

void OnNavigateComplete(object pDisp, ref object URL)
{
  if ((_currentDocument != null) && (isValidURL(_currentDocument.url))) 
  {
      injectFrame();
  }
}
void OnDocumentComplete(object pDisp, ref object URL)
{
    if (Explorer.ReadyState == SHDocVw.tagREADYSTATE.READYSTATE_COMPLETE)
    {
        _currentDocument = Explorer.Document as mshtml.HTMLDocument;
        if (_currentDocument != null)
        {
            //injectFrame();
        }
    }
}

好吧,我想我已经基本弄清楚了。OnDocumentComplete仍然被调用不止一次,但我已经解决了框架的所有问题......因此,当 iframe 多次加载时,它会在同一个地方加载。

无限循环的修复是对工具栏的位置进行硬编码,并在 OnDocumentComplete 中检查该 URL:

void OnDocumentComplete(object pDisp, ref object URL)
{
  // _currentDocument = Explorer.Document as mshtml.HTMLDocumentClass;
    if (Explorer.ReadyState == SHDocVw.tagREADYSTATE.READYSTATE_COMPLETE)
    {
        _currentDocument = Explorer.Document as mshtml.HTMLDocument;
        if (_currentDocument != null)
        {
            // we have a document - attach our events
            // on onload event should go here if the document is now complete...
            if (!URL.Equals("http://url.to/foo.html")) injectFrame();
        }
        else
        {
            // document is null?
            // Debugger.ShowMessage("Tried to attach to document, but was null");
        }
    }
}

就 iframe 而言,Style 属性显然是它自己的字符串集,而不是像每个 OTHER 属性那样只是一个常规字符串。因此,与其做类似的事情...

setAttribute("style","position: fixed; left: 0px; top: 0px; border: 0px; width: 100%; height: 45px; background-color: white");

我最终不得不做

iframe.style.setAttribute("position", "fixed");
iframe.style.left="0px";
iframe.style.top="0px";
iframe.style.border="0px";
iframe.style.width = "100%";
iframe.style.height="45px";
iframe.style.backgroundColor="white";

这整件事一直非常令人头疼,我希望永远不必再处理它。

最新更新