我一直在阅读并跟进如何使用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!!
}
}
它让我难倒了几天,甚至改变了文件。标题并不总是留下来。
答案 0 :(得分:0)
我能够通过线程化我的BHO并将其睡眠大约半秒来解决这个问题。有趣的是,我需要将睡眠时间提高到大约1.5秒来处理外部链接(比如来自outlook的内容)以加载并显示所有内容。
我不确定这是否是最好的方法,但它解决了我的问题,只在第一个标签中工作。