6

を使用して C# アプリケーションを構築しており、WebBrowser画像をブロックする方法、つまり、Web サイトの読み込み時に画像が表示されないようにする方法を見つけようとしています (Web サイトがより簡単に読み込まれるようにするため)。

<img>タグを取得して画像webBrowser1.DocumentTextを削除することでタグを削除しようとしましたが、コードを使用しているときにRegex.Replace空白のページが表示されます。aaa画像を削除するより良い方法はありますか? どんな助けでも大歓迎です。

コード:

var html_source = webBrowser1.DocumentText;
var newOne = Regex.Replace(html_source, "<img.*/>", "", RegexOptions.Multiline);
webBrowser1.DocumentText = newOne + "aaa";

アップデート:

以下のコードを試しました (テストのためだけに) が、まだ表示されますaaa

var html_source = webBrowser1.DocumentText;
webBrowser1.DocumentText = html_source + "aaa";
4

6 に答える 6

4

これを試すことができます:

private void webBrowser1_ProgressChanged(object sender, WebBrowserProgressChangedEventArgs e)
{
  if (webBrowser1.Document != null)
  {
     foreach (HtmlElement imgElemt in webBrowser1.Document.Images)
     {
        imgElemt.SetAttribute("src", "");
     }
   }
}
于 2013-01-27T16:29:30.780 に答える
4

編集

SO でこの質問を見つけ、 codeproject.comで役立つ完全なプロジェクトを見つけました。この例には、webBrowser COM コンポーネントを使用する userControlがあります。元の回答で書いたように、.net Framework WebBrowser が images をロードするのを防ぐことはできないと思います。ブラウザ コントロールがプレーン html テキストを受け取った後、ロード中の画像をインターセプトするには、以下のレベルにアクセスする必要があります。

... コントロールの最も目立たない重要な部分はIDispatch_Invoke_Handler()です。... IE が表示していたもの(画像、ActiveX コントロール、Java など)を制限するために IDispatch::Invoke を実装する方法。コードに -5512の COM ディスパッチ識別子を使用して IDispatch_Invoke_Handler() メソッドを追加すると、これで問題が解決することがわかりました。非常にあいまいな答えですが、うまくいきます....

オリジナル

あなたはこれを試すことができます

private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
     Debug.WriteLine("documentCompleted");
     HtmlDocument doc = webBrowser1.Document;
     foreach (HtmlElement  imgElemt in doc.Images)
     {
         imgElemt.SetAttribute("src", "");
     }
}

しかし、MSDNが言うように

DocumentCompleted イベントを処理して、新しいドキュメントの読み込みが完了したときに通知を受け取ります。DocumentCompleted イベントが発生すると、新しいドキュメントが完全に読み込まれます。つまり、Document、DocumentText、または DocumentStream プロパティを介してそのコンテンツにアクセスできます。

.net Framework の webBrowser コントロールでこれを行うことはできないと思います。

于 2012-08-31T07:34:36.667 に答える
4

Web ブラウザー コントロールは、Internet Explorer が使用するのと同じ設定を使用します。

画像を簡単に無効にすることができますが、インターネット エクスプローラーと Web ブラウザー コントロール (およびインターネット エクスプローラー機能を使用する他のプログラム) に影響することに注意してください。

画像の読み込みを無効にするには:

1.) インテジェント エクスプローラーを開く

2.) [ツール] > [インターネット オプション] に移動します。

3.) 「詳細」タブに移動します

4.) 「画像を表示」チェックボックスが見つかるまで下にスクロールし、チェックを外します (「マルチメディア」セクションにあります)。

この変更の効果はレジストリに保存されるので、プログラムで編集することもできるはずです。ただし、アプリケーション以外にも影響があることに注意してください。

于 2013-03-05T15:10:23.553 に答える
3

最近、Web ブラウザー コントロール内のすべての通信を傍受して分析する必要がありました。私が使ったテクニックはあなたを助けることができると思います。

何が必要 :

  • Awesomium.Net : .net 用の Chromium エンジン ベースのコントロール
  • Fiddler Core : http 通信を監視できる http インメモリ プロキシ。
  • HtmlAgility pack : 選択したソリューションに応じて、HAP は、正規表現よりもはるかに信頼性の高い方法で、html コンテンツの DOM を動的に変更するのに役立ちます。

私が Awesomium を使用することにしたのは、すぐに使用できる Web ブラウザー コントロールよりも多くの機能を提供するためです。私の場合、システム全体の設定の代わりに使用するプロキシを定義できます。

Fiddler Core は、通信を傍受するために使用されます。その API は、リクエストが発行されたときにインターセプト/改ざん/... する方法を提供します。私の場合、私はビジネスクラスに応答本文を転送するだけでしたが、あなたの場合、MIME タイプでフィルタリングして、HTML DOM を変更する ( HtmlAgility パックを使用する!!!!! ) か、200 以外を返すことができるはずです。画像の http ステータス。

これが私が使用したコードです。私のアプリは WPF ですが、わずかな労力で winform に適応させることができます:

public partial class App : Application
{
    static App()
    {
        // First, we set up the internal proxy
        SetupInternalProxy();
        // The we set up the awesomium engine
        SetupBrowser();
    }
    private static void SetupInternalProxy()
    {
        // My requirement is to get response content, so I use this event.
        // You may use other handlers if you have to tamper data.
        FiddlerApplication.AfterSessionComplete += FiddlerApplication_AfterSessionComplete;
        FiddlerApplication.Log.OnLogString += (o, s) => Debug.WriteLine(s);

        FiddlerCoreStartupFlags oFCSF = FiddlerCoreStartupFlags.Default;

        //this line is important as it will avoid changing the proxy for the whole system.
        oFCSF = (oFCSF & ~FiddlerCoreStartupFlags.RegisterAsSystemProxy);

        FiddlerApplication.Startup(0, oFCSF);

    }
    private static void SetupBrowser()
    {
        // We may be a new window in the same process.
        if (!WebCore.IsRunning)
        {
            // Setup WebCore with plugins enabled.
            WebCoreConfig config = new WebCoreConfig
            {
                // Here we plug the internal proxy to the awesomium engine
                ProxyServer = "http://127.0.0.1:" + FiddlerApplication.oProxy.ListenPort.ToString(),
                // Adapt others options related to your needs
                EnablePlugins = true,
                SaveCacheAndCookies = true,
                UserDataPath = Environment.ExpandEnvironmentVariables(@"%APPDATA%\MyApp"),
            };
            WebCore.Initialize(config);
        }
        else
        {
            throw new InvalidOperationException("WebCore should be already running");
        }
    }
    // Here is the handler where I intercept the response
    private static void FiddlerApplication_AfterSessionComplete(Session oSession)
    {
        // Send to business objects
        DoSomethingWith(
            oSession.PathAndQuery,
            oSession.ResponseBody,
            oSession["Response", "Content-Type"]
            );

    }
}

コメントで述べたように、AfterSessionComplete という別のイベント ハンドラーを使用することもできます。要件によって異なります (ヘルプを得るには、fiddler コア SDK を参照してください)。

最後に、このコードは app クラス (Winform の Program クラスに相当) から実行されます。Windows クラスで結果を使用するには、メッセージング システムを使用するか、グローバル イベントを発行する必要がある場合があります (メモリ リークに注意してください)。また、AfterSessionComplete イベントが複数のスレッドから、場合によっては同時に発生することにも注意する必要があります。UI スレッドで作業するには、ある種の Invoking を使用します。

于 2012-08-31T08:52:23.320 に答える
1
HtmlElementCollection elc = WebBrowser1.Document.GetElementsByTagName("img");
foreach (HtmlElement el in elc)
{
   if (el.GetAttribute("src") != null)
   {
       el.SetAttribute("src", "");
   }
}

画像を含む可能性のある要素がある場合、それはimgタグになります。

于 2013-06-04T03:05:58.193 に答える
0

この目的のために、Lazy Load ロード手法を使用できます。http://engineering.slideshare.net/2011/03/faster-page-loads-with-image-lazy-loading/を参照してください。

于 2012-08-31T07:31:39.117 に答える