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

时间:2009-04-02 06:35:35

标签: c# internet-explorer-8 browser code-injection mshtml

我正在尝试将一些其他HTML附带的CSS注入C#托管的WebBrowser控件。我试图通过底层的MSHTML(DomDocument属性)控件来执行此操作,因为此代码用作完整IE8 BHO的各​​种原型。

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

如果我将包含我要插入的HTML的字符串与注入后的目标页面源进行比较,那么MSHTML的源代码将包含{{1>}元素及其基础源的之外的所有内容

CSS通过了CSS 2.1的W3C验证。它没有做任何太棘手的事情,除了一些背景图像属性将图像直接嵌入到CSS中(例如<style> ...),并且注释掉这些行并不会改变结果。

更奇怪的是(而且我不确定这是否相关),我上周没有遇到任何问题。本周我又回到了它,在切换了一些在实际注入之前处理要注入的HTML的代码之后,它不再起作用了。当然,我认为我的某个更改可能会出现问题,但在对所有逻辑进行评论并将其直接输入后,HTML仍然显示为未格式化。

目前我正在注入background-image: url("data:image/png;base64标签,虽然我已经尝试注入<body>,并且会遇到类似的结果。

提前感谢您的帮助!

汤姆

1 个答案:

答案 0 :(得分:15)

结束了解决这个问题:

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;
}

我没有意识到createStyleSheet会在文档的DOM中创建一个仍然“活动”的指针...因此您不需要将创建的样式表追加回其父级。我最终通过研究Javascript的动态CSS代码来解决这个问题,因为实现几乎完全相同。