所以不幸的是,我一直在为 Internet Explorer 编写 BHO。它的功能是在用户访问的每个网页中注入一个 iframe,在用户处理他或她的业务时显示一些(相对)恒定的信息。我已经通过一系列相当老套的 mshtml 强制转换来管理注入,如下所示,其中 Explorer 是一个 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。循环的问题是使用 Explorer 的事件侦听器,例如 OnDocumentComplete,因为只要 iFrame 内的页面完成加载,它们就会被调用,然后调用注入函数,然后调用 OnDocumentComplete,这......好吧,你明白了。我试过使用 OnNavigateComplete,但它仍然会在从多个来源加载的页面上多次加载(例如,启用自动完成功能的谷歌主搜索页面。)但即使它没有进入无限循环,我仍然没有得到可见的 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();
}
}
}