C# 如何使用IE插件向页面注入样式

C# 如何使用IE插件向页面注入样式,c#,internet-explorer,com,ieaddon,C#,Internet Explorer,Com,Ieaddon,我正在尝试将我为Google Chrome编写的一个插件转换为IE插件,主要使用中的代码 我需要注入一个样式表,我找到了一个。我想我可以用C做同样的事情。这是我的密码: [ComVisible(true)] [Guid(/*替换*/)] [ClassInterface(ClassInterfaceType.None)] 公共类simplewho:IObjectWithSite { 私人网络浏览器; void webBrowser_DocumentComplete(对象pDisp,参考对象URL)

我正在尝试将我为Google Chrome编写的一个插件转换为IE插件,主要使用中的代码

我需要注入一个样式表,我找到了一个。我想我可以用C做同样的事情。这是我的密码:

[ComVisible(true)]
[Guid(/*替换*/)]
[ClassInterface(ClassInterfaceType.None)]
公共类simplewho:IObjectWithSite
{
私人网络浏览器;
void webBrowser_DocumentComplete(对象pDisp,参考对象URL)
{
var document2=webBrowser.documentas IHTMLDocument2;
var document3=webBrowser.Document作为IHTMLDocument3;
//正在尝试将“”元素添加到标头。此操作无效。
var style=document2.createElement(“样式”);
style.innerHTML=“.foo{background color:red;}”;//这一行是罪魁祸首!
setAttribute(“类型”、“文本/css”);
var headCollection=document3.getElementsByTagName(“head”);
var head=headCollection.item(0,0)作为IHTMLDOMNode;
var result=head.appendChild(样式为IHTMLDOMNode);
//正在尝试重新绘制主体中的元素。如果
//添加样式成功。
var journalCollection=document3.getElementsByName(“元素id”);
var日记账=日记账集合。项目(0,0)作为IHTMlement;
journal.innerHTML=“已替换!”;
//正在尝试执行一些JavaScript。如果
//添加样式成功。
document2.parentWindow.execScript(“警报('Hi!'));
}
int IObjectWithSite.SetSite(对象站点)
{
如果(站点!=null)
{
webBrowser=(webBrowser)站点;
webBrowser.DocumentComplete+=新的DWebBrowserEvents 2_DocumentCompleteEventHandler(webBrowser_DocumentComplete);
}
其他的
{
webBrowser.DocumentComplete-=新的DWebBrowserEvents 2_DocumentCompleteEventHandler(webBrowser_DocumentComplete);
webBrowser=null;
}
返回0;
}
/*为了提高清晰度,省略了一些代码(例如:IObjectWithSite.SetSite)*/
}
如果我只是注释掉下面一行

style.innerHTML=“.foo{背景色:红色;}”;
。。。其余的代码执行得很好(元素
#elem_id
被替换,我注入的JavaScript被执行)

在尝试注入样式表时,我做错了什么?这可能吗


编辑:我发现我尝试注入CSS的站点请求文档模式5,当兼容性视图被禁用时,我的代码工作得非常好。但是,即使在启用了兼容性视图的情况下,我如何使其工作呢?

经过大量的实验,我发现注入样式表的唯一安全方法是使用JavaScript注入样式表,而JavaScript是用JavaScript执行的

我使用了以下JavaScript:

var style=document.createElement('style');
document.getElementsByTagName('head')[0].appendChild(样式);
var sheet=style.styleSheet | | style.sheet;
if(sheet.insertRule){
insertRule('.foo{背景色:红色;}',0);
}else if(sheet.addRule){
sheet.addRule('.foo','背景色:红色;',0);
}
上述JavaScript以以下方式执行:

//此代码是在用C编写的BHO中编写的#
var document2=webBrowser.documentas IHTMLDocument2;
document2.parentWindow.execScript(@)
/*这里,我们有上面提到的相同JavaScript*/
var style=docu。。。。
...
}");
document2.parentWindow.execScript(“警报('Hi!'));

我记得一些关于在IE中添加脚本和样式元素的事情,认为它们是“noscope”元素。您还应该尝试另一种方法,通过创建样式表并使用
addRule()
,或旧的/compat IE的等效方法。