質問

私はC#はWebBrowserコントロールを管理するに他のいくつかのHTMLを伴ういくつかのCSSを注入しようとしています。私は、このコードは、完全なIE8のBHOのための一種のプロトタイプとして提供しているように、基礎となるMSHTML(DOMDOCUMENTプロパティ)コントロールを経由して、これを行うにしようとしています。

私はと(mydomdocument.parentWindow.execScript経由)のJavascript(mydomdocument.body.insertAdjacentHTMLを経由して)HTMLを注入することができますしながら、

問題は、ある、それは私のCSSコードを拒否フラットアウトです。

私は、注射後の移動先ページのソースを挿入するHTMLを含む文字列を比較すると、MSHTMLのソースは、文字通りすべてを含んでいます。<style>要素とその基礎となるソースを除きます。

CSSはCSS 2.1のためのW3C検証に合格します。これは、いくつかの背景画像のプロパティは、画像を直接CSSに埋め込まれていることを除いては、あまりにもトリッキーな何もしない(例えばbackground-image: url("data:image/png;base64 ...)、その結果を変更しないこれらの行をコメントアウトします。

より多くの奇妙な(と私は、これは関連性があるかどうかわからないです)、私はこの最後の週とは問題を抱えていなかったということでした。私は、実際の注入前に、注入されたHTMLを処理するコードの一部の周りに切り替えた後に、それはもはや働いていた、今週のそれに戻って来なかったと。当然、私は私の変化の一つが何らかの形で問題になるかもしれないと思ったが、うちすべてそのロジックをコメントし、それをHTMLはまだ未フォーマット表示されているまっすぐな文字列を供給した後ます。

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

あなたの助けを事前に感謝!

トム

役に立ちましたか?

解決

この自分自身を解いてしまっます:

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コードを勉強することによって、これを考え出すことになった。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top