Блокировка диалогов в .NET WebBrowser - PullRequest
19 голосов
/ 17 сентября 2008

У меня есть .NET 2.0 Элемент управления WebBrowser, используемый для навигации по некоторым страницам без взаимодействия с пользователем (не спрашивайте ... длинная история). Из-за бесполезной природы этого приложения я установил для свойства ScriptErrorsSuppressed элемента управления WebBrowser значение true, которое в документации, включенной в состояния VS 2005, [...] будет скрывать все его диалоговые окна, которые происходят из базового элемента управления ActiveX не только ошибки скрипта. " Однако в статье MSDN об этом не говорится. Мне удалось отменить событие NewWindow, которое предотвращает всплывающие окна, поэтому об этом позаботились.

Кто-нибудь имеет опыт использования одного из них и успешно блокирует все диалоги, ошибки скриптов и т. Д.?

EDIT

Это не автономный экземпляр IE, а экземпляр элемента управления WebBrowser, находящийся в приложении Windows Form. Кто-нибудь имеет опыт работы с этим элементом управления, или с базовым, AxSHDocVW ?

ИЗМЕНИТЬ снова

Извините, я забыл упомянуть об этом ... Я пытаюсь заблокировать предупреждение JavaScript () , просто нажав кнопку ОК. Может быть, я могу привести в объект IHTMLDocument2 и получить доступ к сценариям таким образом, я немного использовал MSHTML, кто-нибудь знает?

Ответы [ 13 ]

0 голосов
/ 23 февраля 2012

У меня были большие проблемы с этим: загрузка веб-страницы, предназначенной для печати, с отображением раздражающего диалогового окна «Печать». InjectBlocker был единственным способом, который работал, но довольно ненадежным. При определенных условиях (я полагаю, это связано с тем, что элемент управления WebBrowser использует движок IE, а это зависит от установленной версии IE), диалоговое окно печати по-прежнему отображается. Это серьезная проблема, решение работает на Win7 с установленным IE9, но WinXP с IE8 отображает диалоговое окно, несмотря ни на что.

Я полагаю, что решение заключается в изменении исходного кода и удалении javascript для печати до того, как элемент управления отобразит страницу. Однако я попытался сделать это с помощью свойства DocumentText элемента управления webbrowser, и оно не работает. Свойство не только для чтения, но оно не влияет, когда я изменяю источник.

Решение, которое я нашел для моей проблемы, - это скрипт Exec:

string alertBlocker = "window.print = function emptyMethod() { }; window.alert = function emptyMethod() { }; window.open = function emptyMethod() { };";    
this.Document.InvokeScript("execScript", new Object[] { alertBlocker, "JavaScript" });
0 голосов
/ 01 декабря 2008

Мне удалось внедрить приведенный выше код, создав расширенный класс WebBroswer и переопределив метод OnNavigated.

Казалось, это работает довольно хорошо:

class WebBrowserEx : WebBrowser
{
  public WebBrowserEx ()
  {
  }

  protected override void OnNavigated( WebBrowserNavigatedEventArgs e )
  {
       HtmlElement he = this.Document.GetElementsByTagName( "head" )[0];
       HtmlElement se = this.Document.CreateElement( "script" );
       mshtml.IHTMLScriptElement element = (mshtml.IHTMLScriptElement)se.DomElement;
       string alertBlocker = "window.alert = function () { }";
       element.text = alertBlocker;
       he.AppendChild( se );
       base.OnNavigated( e );
  }
}
0 голосов
/ 19 сентября 2008

Вы пытаетесь внедрить веб-робота? У меня мало опыта в использовании размещенного элемента управления IE, но я выполнил несколько проектов Win32, пытаясь использовать элемент управления IE. Отключение всплывающих окон должно выполняться через обработчики событий элемента управления, как вы уже это сделали, но я обнаружил, что вам также нужно изменить «Отключить отладку сценария xxxx» в параметрах IE (или вы можете изменить реестр в своих кодах) как Cjheath уже указал. Однако я также обнаружил, что необходимо выполнить дополнительные шаги по проверке URL-адреса навигации для любого загружаемого содержимого, чтобы предотвратить эти диалоги открытия / сохранения. Но я не знаю, как обращаться с потоковыми файлами, так как не могу пропустить их, просматривая только URL-адреса, и в конце концов я обратился к библиотеке Indy, избавив меня от всех проблем, связанных с IE. Наконец, я помню, что Microsoft упоминала в Интернете что-то, что IE не предназначен для использования в качестве элемента управления OLE. Исходя из моего собственного опыта, каждый раз, когда элемент управления переходит на новую страницу, возникают утечки памяти для программ!

...