2012-08-31 8 views
5

Estoy construyendo una aplicación C# con un WebBrowser y estoy tratando de encontrar una manera de bloquear imágenes, es decir, que no se muestren cuando se carga un sitio web (para que el sitio web cargas más fácilmente).Cómo bloquear las imágenes en el navegador web

He tratado de eliminar las etiquetas <img> por conseguir que a través de webBrowser1.DocumentText y el uso de Regex.Replace para eliminar las imágenes, pero luego se me muestra una página en blanco con aaa cuando estoy usando el código. ¿Hay una mejor manera de eliminar las imágenes? Cualquier ayuda muy apreciada.

Código:

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

Actualización:

He tratado a continuación código (sólo para las pruebas), pero es todavía me muestra solo aaa.

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

Es posible que desee el no codicioso +? cuantificador: '" "' – AKX

+3

¡Ahhh! ¡Analizando HTML con Regex! http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags – annonymously

Respuesta

4

EDITAR

encontrado this question el SO y un proyecto completo que le puede ayudar en codeproject.com. Dentro de este ejemplo, hay un userControl que utiliza el componente COM webBrowser. Como escribí en mi respuesta original I , no creo que sea posible para evitar que .net Framework WebBrowser cargue imágenes. Necesita acceder al nivel siguiente a interceptar las imágenes de carga después de que el control del navegador haya recibido el texto html simple.

... La parte más oscura e importante de el control es el IDispatch_Invoke_Handler(). ... cómo implementar IDispatch :: Invoke para restringir lo que IE muestra (como imágenes, controles ActiveX, Java). descubrí que si se agrega un método IDispatch_Invoke_Handler() en su código con el identificador de despacho COM de -5512, esto hace el trabajo para usted . Una respuesta muy oscura, pero funciona bien ....

ORIGINAL

Usted puede probar este

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

Pero como dice MSDN

manija del DocumentCompleted evento para recibir una notificación cuando el documento nuevo finaliza la carga. Cuando se produce el evento DocumentCompleted , el nuevo documento está completamente cargado, lo que significa que puede acceder al contenido a través de la propiedad Document, DocumentText o DocumentStream .

No creo que pueda hacer esto con el control webBrowser de .net Framework.

1

Recientemente, tuve la necesidad de interceptar y analizar TODAS las comunicaciones en un control de navegador web. Creo que la técnica que utilicé puede ayudarte.

lo que necesita:

  • Awesomium.Net: un control basado en el motor de cromo para .NET
  • Fiddler Core: un proxy HTTP en memoria, que le permite controlar la comunicación HTTP.
  • HtmlAgility pack: según la solución que elija, HAP puede ayudarle a cambiar dinámicamente el DOM del contenido html, de una forma MUCHO MÁS CONFIABLE que una expresión regular.

Elijo usar Awesomium porque ofrece muchas más funciones que el navegador de la caja de control de la web. En mi caso, me permite definir el proxy a usar en lugar de la configuración de todo el sistema.

Fiddler Core se utiliza para interceptar la comunicación. Su API proporciona formas de interceptar/forzar/... cuando se emiten solicitudes. En mi caso, solo estaba enviando cuerpos de respuesta a mis clases de negocios, pero en su caso, debería poder filtrar en mime-type para cambiar el HTML DOM (Usar el paquete HtmlAgility !!!!!) o devolverlo no 200 estado HTTP para imágenes.

Aquí está el código que utilicé. Mi aplicación WPF, pero se puede adaptar a Winform con pocos esfuerzos:

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"] 
      ); 

    } 
} 

Como dije en el comentario, es posible usar otro controlador de eventos que AfterSessionComplete. Dependerá de sus requisitos (lea el SDK del núcleo del violinista para obtener ayuda).

Una última palabra: este código se ejecuta desde la clase de la aplicación (equivalente a la clase de programa en Winform). Es posible que necesite utilizar un sistema de mensajería o publicar un evento global (tenga cuidado con la pérdida de memoria) para usar el resultado en una clase de Windows. También debe tener en cuenta que el evento AfterSessionComplete se activa desde varios subprocesos, a veces simultáneamente. Utilizará algún tipo de invocación para trabajar en el hilo de la interfaz de usuario.

+0

Un intento valiente, pero no algo fuera de lo común ... de hecho, más bien complejo, por lo que downvoted, lo siento. – tmighty

4

Usted puede intentar esto:

private void webBrowser1_ProgressChanged(object sender, WebBrowserProgressChangedEventArgs e) 
{ 
    if (webBrowser1.Document != null) 
    { 
    foreach (HtmlElement imgElemt in webBrowser1.Document.Images) 
    { 
     imgElemt.SetAttribute("src", ""); 
    } 
    } 
} 
3

el control WebBrowser utiliza la misma configuración que utiliza Internet Explorer.

puede desactivar fácilmente las imágenes, pero tenga en cuenta que va a efectuar el Internet Explorer, así como el control de navegador web (y otros programas que utilizan la funcionalidad de Internet Explorer)

desactivar las imágenes de carga:

1 .) abierta integent explorador

2.) vaya a 'herramientas'> 'opciones de Internet'

3.) vaya a la pestaña 'avanzado'

4.) desplácese hacia abajo hasta que encuentre la casilla de verificación 'mostrar imágenes' y desmarquela (está en la sección 'multimedia')

los efectos de este cambio se almacenan en el registro i beleive, por lo que debería poder editar también programáticamente. tenga en cuenta que afectará más que solo su aplicación, sin embargo.

1
HtmlElementCollection elc = WebBrowser1.Document.GetElementsByTagName("img"); 
foreach (HtmlElement el in elc) 
{ 
    if (el.GetAttribute("src") != null) 
    { 
     el.SetAttribute("src", ""); 
    } 
} 

si hay algún elemento que puede contener imágenes, entonces será en una etiqueta img.

Cuestiones relacionadas