C#:将CSS注入MSHTML实例的最佳方法?

C#:将CSS注入MSHTML实例的最佳方法?,c#,internet-explorer-8,browser,code-injection,mshtml,C#,Internet Explorer 8,Browser,Code Injection,Mshtml,我试图将一些CSS与其他HTML一起注入到C#管理的WebBrowser控件中。我正试图通过底层的MSHTML(domdocumentproperty)控件来实现这一点,因为这段代码是完整IE8 BHO的原型 问题是,虽然我可以注入HTML(通过mydomdocument.body.insertAdjacentHTML)和Javascript(通过mydomdocument.parentWindow.execScript),但它完全拒绝了我的CSS代码 如果在注入后将包含要插入的HTML的字符串

我试图将一些CSS与其他HTML一起注入到C#管理的WebBrowser控件中。我正试图通过底层的MSHTML(domdocumentproperty)控件来实现这一点,因为这段代码是完整IE8 BHO的原型

问题是,虽然我可以注入HTML(通过mydomdocument.body.insertAdjacentHTML)和Javascript(通过mydomdocument.parentWindow.execScript),但它完全拒绝了我的CSS代码

如果在注入后将包含要插入的HTML的字符串与目标页面源代码进行比较,则MSHTML的源代码将包含除
元素及其底层源代码之外的所有内容

CSS通过了CSS 2.1的W3C验证。除了一些背景图像属性将图像直接嵌入CSS(例如,
background-image:url(“data:image/png;base64
”)之外,它不会做任何太棘手的事情,并且注释掉这些行不会改变结果

更奇怪的是(我不确定这是否相关)上周我没有遇到任何问题。本周我又回到了这个问题上,在切换了一些在实际注入之前处理待注入HTML的代码之后,它不再工作了。当然,我认为我的一个更改可能是问题所在,但在对所有逻辑进行了注释并给它一个straig之后ht字符串HTML仍然显示为未格式化

目前我正在注入
标记,尽管我已经尝试注入
,但也得到了类似的结果

提前感谢您的帮助


汤姆最终自己解决了这个问题:

mshtml.HTMLDocument test = (mshtml.HTMLDocument)webBrowser1.Document.DomDocument;

//inject CSS
if (test.styleSheets.length < 31) { // createStyleSheet throws "Invalid Argument if >31 stylesheets on page

    mshtml.IHTMLStyleSheet css = (mshtml.IHTMLStyleSheet)test.createStyleSheet("", 0);
    css.cssText = myDataClass.returnInjectionCSS(); // String containing CSS to inject into the page
        // CSS should now affect page

} else {
    System.Console.WriteLine("Could not inject CSS due to styleSheets.length > 31");
    return;
}
mshtml.HTMLDocument test=(mshtml.HTMLDocument)webBrowser1.Document.DomDocument;
//注入CSS
if(test.styleSheets.length<31){//createStyleSheet在页面上>31个样式表时抛出“无效参数”
mshtml.IHTMLStyleSheet css=(mshtml.IHTMLStyleSheet)test.createStyleSheet(“,0”);
css.cssText=myDataClass.returnInjectionCSS();//包含要注入页面的css的字符串
//CSS现在应该会影响页面
}否则{
System.Console.WriteLine(“由于styleSheets.length>31,无法插入CSS”);
返回;
}
我没有意识到的是,createStyleSheet创建的指针在文档的DOM中仍然是“活动”的……因此,您不需要将创建的样式表追加回其父级。我通过研究Javascript的动态CSS代码最终发现了这一点,因为实现几乎完全相同