2012-08-31 13 views
5

Buduję aplikację C# z WebBrowser i staram się wymyślić sposób blokowania obrazów, tj. Aby nie wyświetlały się podczas ładowania strony (tak, aby strona internetowa ładuje się łatwiej).Jak blokować obrazy na przeglądarce internetowej

Próbowałem usunąć <img> tagów przez coraz to poprzez webBrowser1.DocumentText i korzystania Regex.Replace usunąć obrazy, ale to pokazuje mi pustą stronę z aaa kiedy używam kod. Czy istnieje lepszy sposób na usunięcie zdjęć? Każda pomoc bardzo doceniona.

Kod:

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

Aktualizacja:

Próbowałem poniżej kodu (tylko do testowania), ale nadal pokazuje mi tylko aaa.

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

Może chcesz nie-chciwy +? Kwantyfikator: '" "' – AKX

+3

Ahhh! Parsowanie HTML za pomocą Regex! http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags – annonymously

Odpowiedz

4

EDIT

Znaleziony this question na SO i kompletny projekt, który może pomóc w codeproject.com. W tym przykładzie znajduje się instrukcja użytkownika przy użyciu składnika COM przeglądarki WebBrowser. Jak napisałem w mojej oryginalnej odpowiedzi I nie sądzę, że jest to możliwe, aby zapobiec .NET Framework WebBrowser ładować obrazy. Musisz uzyskać dostęp do poniższego poziomu, aby przechwycić ładowanie obrazów po tym, jak formant przeglądarki otrzymał tekst w zwykłym html.

... Najbardziej niejasne i ważną częścią kontroli jest IDispatch_Invoke_Handler(). ... jak wdrożyć narzędzie IDispatch :: Wywołanie w celu uzyskania ograniczenia tego, co IE pokazano (takie jak obrazy, formanty ActiveX, Java). Dowiedziałem się, że jeśli dodasz metodę IDispatch_Invoke_Handler() w twój kod z identyfikatorem wysyłki COM z -5512, to wykona zadanie dla ciebie. Bardzo niejasna odpowiedź, ale działa dobrze ....

ORIGINAL

Możesz spróbować tego

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

Ale jak mówi MSDN

obsłużyć DocumentCompleted zdarzenie, aby otrzymywać powiadomienie o zakończeniu ładowania nowego dokumentu. Po wystąpieniu zdarzenia DocumentCompleted nowy dokument jest w pełni załadowany, co oznacza, że ​​można uzyskać dostęp do jego zawartości za pośrednictwem właściwości Document, DocumentText lub DocumentStream .

Nie sądzę, że można to zrobić za pomocą formantu webBrowser z .NET Framework.

1

Niedawno miałem obowiązek przechwytywać i analizować WSZYSTKIE komunikaty w kontrolce przeglądarki. Myślę, że technika, której użyłem, może ci pomóc.

Co trzeba:

  • Awesomium.Net: kontrola oparta na silniku Chromium NET
  • Fiddler Core: HTTP proxy w pamięci, który pozwala na monitorowanie komunikacji HTTP.
  • HtmlAgility pack: w zależności od wybranego rozwiązania, HAP może pomóc dynamicznie zmieniać DOM treści HTML, w sposób FAR WIĘKSZY NIEZAWODNY niż regex.

Wybieram korzystanie z Awesomium, ponieważ zapewnia znacznie więcej funkcji niż po wyjęciu z pudełka kontroli przeglądarki. W moim przypadku pozwala mi to zdefiniować proxy zamiast całego systemu.

Fiddler Core służy do przechwytywania komunikacji. Interfejs API zapewnia sposoby przechwytywania/manipulowania/... po wysłaniu żądania. W moim przypadku przesyłałem tylko odpowiedzi do moich klas biznesowych, ale w twoim przypadku powinieneś być w stanie filtrować na typie MIME, aby zmienić HTML DOM (Użyj pakietu HtmlAgility !!!!!) lub zwróć brak statusu http dla obrazów.

Oto kod, którego użyłem. Moja aplikacja jest WPF, ale można ją dostosować do winform z kilku działań:

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

    } 
} 

Jak powiedział w komentarzu, można użyć innego programu obsługi zdarzeń, która AfterSessionComplete. Będzie to zależało od twoich wymagań (przeczytaj klucz SDK fiddlera, aby uzyskać pomoc).

Ostatnie słowo: ten kod jest uruchamiany z klasy aplikacji (odpowiednik klasy Program w Winform). Może być konieczne użycie systemu przesyłania komunikatów lub opublikowanie zdarzenia globalnego (uwaga na wyciek pamięci) w celu użycia wyniku w klasie okna. Musisz także pamiętać, że zdarzenie AfterSessionComplete jest uruchamiane z wielu wątków, czasami jednocześnie. Użyjesz jakiegoś rodzaju wywoływania do pracy w wątku interfejsu użytkownika.

+0

Odważna próba, ale nie coś nieoczekiwanego ... w rzeczywistości raczej złożony, więc zaaprobowałem, przepraszam. – tmighty

4

Możesz spróbować tego:

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

Kontrola webbrowser wykorzystuje te same ustawienia, które Internet Explorer używa.

można łatwo wyłączyć obrazów, ale należy pamiętać, że będzie to efekt programu Internet Explorer, a także swoją kontrolę WebBrowser (i inne programy, które za pomocą Eksploratora funkcjonalność Internet)

wyłączyć obrazy z ładowania:

1 .) otwarte integent explorer

2.) przejdź do 'narzędzia'> 'Opcje internetowe'

3.) przejdź do zakładki 'Zaawansowane'

4.) przewijaj w dół, aż znajdziesz pole wyboru "pokaż obrazki" i odznacz je (znajduje się w sekcji "multimedia").

efekty tej zmiany są przechowywane w rejestrze, które uważam, więc powinieneś być w stanie edytować programowo również. pamiętaj jednak, że wpłynie to nie tylko na Twoją aplikację.

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

czy jest jakiś element, który może zawierać obrazy to będzie w tagu img.

Powiązane problemy