我一直在閱讀和跟進如何在IE中使用C#編寫BHO,我可以註冊它並且運行它,但它只能在第一個時正常工作窗口\標籤我已經打開。BHO只在第一個IE窗口或標籤打開
我知道它的各個方面在每個新窗口中都會觸發,但如果它們影響DOM,這些更改不會「粘」或應用。因此,例如,我加載了一個頁面,該頁面在頁面頂部顯示一些文本,它將始終在第一個選項卡中,但其中可能存在的所有其他文件首先會消失或根本不顯示。
我在使用IE11的Win7x64上使用c#4。保護模式似乎不會影響這種或那種方式。
我的代碼只是這裏教程明智的一個組合,所以沒有什麼奇特。
namespace IEExtention
{ [ 標記有ComVisible特性(真), 的Guid( 「e8483cfd-d208-45f7-837c-3cdca573d84a」), 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!!
}
}
它有我甚至爲了改變document.title並不總是會留下來,而是爲了這幾天而難過。