3

他の HTML に付随する CSS を C# マネージド WebBrowser コントロールに挿入しようとしています。このコードは完全な IE8 BHO の一種のプロトタイプとして機能しているため、基になる MSHTML (DomDocument プロパティ) コントロールを介してこれを実行しようとしています。

問題は、HTML (mydomdocument.body.insertAdjacentHTML 経由) と Javascript (mydomdocument.parentWindow.execScript 経由) を挿入できますが、CSS コードを完全に拒否することです。

挿入したい HTML を含む文字列をインジェクション後の宛先ページ ソースと比較すると、MSHTML のソースには、要素とその基になるソースを除くすべてが文字通り含まれます。<style>

CSS は、CSS 2.1 の W3C 検証に合格しています。一部の background-image プロパティは画像を直接 CSS に埋め込んでおり (例: background-image: url("data:image/png;base64...)、これらの行をコメントアウトしても結果は変わりません。

さらに奇妙なことに (これが関連しているかどうかはわかりませんが)、先週は問題がなかったということです。今週また戻ってきましたが、実際に挿入する前に、挿入される HTML を処理するコードの一部を切り替えたところ、機能しなくなりました。当然、私の変更の 1 つが何らかの問題である可能性があると考えましたが、すべてのロジックをコメントアウトしてストレート文字列を入力した後でも、HTML はまだフォーマットされていないように見えます。

現時点では、<body>タグに注入していますが、注入しようとしましたが<head>、同様の結果が得られました。

よろしくお願いします。

トム

4

1 に答える 1

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 コードを研究することで、これを理解することになりました。

于 2009-04-05T02:53:02.717 に答える