Блокировка диалогов в элементе управления .NET WebBrowser

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

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

РЕДАКТИРОВАТЬ

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

EDIT снова

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

Это определенно взломанно, но если вы будете работать с элементом управления WebBrowser, вы обнаружите, что занимаетесь большим количеством хакерских атак.

Это самый простой способ, которым я это знаю. Вам нужно добавить JavaScript, чтобы переопределить функцию предупреждения … что-то вроде того, что вы вводите эту функцию JavaScript:

window.alert = function () { } 

Есть много способов сделать это , но это очень возможно. Одна из возможностей – подключить реализацию интерфейса DWebBrowserEvents2 . Как только это будет сделано, вы можете подключиться к NavigateComplete, DownloadComplete или DocumentComplete (или, как мы это делаем, к некоторым их изменениям), а затем вызвать метод InjectJavaScript, который вы реализовали, который выполняет это переопределение window.alert метод.

Как я сказал, взломанный, но он работает 🙂

Я могу подробно рассказать, если понадобится.

И для простого способа введения этой магической линии javascript читайте, как вставлять javascript в элемент управления webbrowser .

Или просто используйте этот полный код:

 private void InjectAlertBlocker() { HtmlElement head = webBrowser1.Document.GetElementsByTagName("head")[0]; HtmlElement scriptEl = webBrowser1.Document.CreateElement("script"); string alertBlocker = "window.alert = function () { }"; scriptEl.SetAttribute("text", alertBlocker); head.AppendChild(scriptEl); } 

Пуленепробиваемый блок предупреждения:

 Browser.Navigated += new WebBrowserNavigatedEventHandler( (object sender, WebBrowserNavigatedEventArgs args) => { Action blockAlerts = (HtmlDocument d) => { HtmlElement h = d.GetElementsByTagName("head")[0]; HtmlElement s = d.CreateElement("script"); IHTMLScriptElement e = (IHTMLScriptElement)s.DomElement; e.text = "window.alert=function(){};"; h.AppendChild(s); }; WebBrowser b = sender as WebBrowser; blockAlerts(b.Document); for (int i = 0; i < b.Document.Window.Frames.Count; i++) try { blockAlerts(b.Document.Window.Frames[i].Document); } catch (Exception) { }; } ); 

В этом примере предполагается, что ссылка Microsoft.mshtml добавлена, « используя mshtml; » в пространствах имен, а Browser - ваш экземпляр WebBrowser .

Почему он пуленепробиваемый? Во-первых, он обрабатывает скрипты внутри фреймов . Затем он не падает, когда в документе существует специальный «кадр-убийца» . «Кадр-убийца» представляет собой фрейм, который вызывает исключение при попытке использовать его как объект HtmlWindow. Любой «foreach», используемый в Document.Window.Frames, вызывает исключение, поэтому более безопасный цикл «для» должен использоваться с блоком try / catch.

Возможно, это не самый читаемый fragment кода, но он работает с реальной жизнью, плохо сформированными страницами.

Возможно, вам придется настроить некоторые вещи, взглянуть на IDocHostUIHandler , а затем проверить некоторые другие связанные интерфейсы. У вас может быть достаточное количество контроля, даже до настройки диалогового отображения / ui (я не могу вспомнить, какой интерфейс это делает). Я уверен, что вы можете делать то, что хотите, но это требует отладки во внутренних сетях MSHTML и возможности реализовать различные COM интерфейсы.

Некоторые другие идеи: http://msdn.microsoft.com/en-us/library/aa770041.aspx

 IHostDialogHelper IDocHostShowUI 

Это может быть то, что вы пытаетесь реализовать.

 webBrowser1.ScriptErrorsSuppressed = true; 

Просто добавьте это в свою функцию начального уровня. После многих исследований, когда я наткнулся на этот метод и дотронулся до дерева, до сих пор его работала. Ура !!

Я только что опубликовал статью о проекте кода, которая может вам помочь.

См. http://www.codeproject.com/KB/shell/WebBrowserControlDialogs.aspx

Надеюсь это поможет.

window.showModelessDialog и window.showModalDialog могут быть заблокированы путем реализации интерфейса INewWindowManager, дополнительно код ниже показывает, как блокировать диалоговые windows предупреждений, реализуя IDocHostShowUI

 public class MyBrowser : WebBrowser { [PermissionSetAttribute(SecurityAction.LinkDemand, Name = "FullTrust")] public MyBrowser() { } protected override WebBrowserSiteBase CreateWebBrowserSiteBase() { var manager = new NewWindowManagerWebBrowserSite(this); return manager; } protected class NewWindowManagerWebBrowserSite : WebBrowserSite, IServiceProvider, IDocHostShowUI { private readonly NewWindowManager _manager; public NewWindowManagerWebBrowserSite(WebBrowser host) : base(host) { _manager = new NewWindowManager(); } public int ShowMessage(IntPtr hwnd, string lpstrText, string lpstrCaption, int dwType, string lpstrHelpFile, int dwHelpContext, out int lpResult) { lpResult = 0; return Constants.S_OK; // S_OK Host displayed its UI. MSHTML does not display its message box. } // Only files of types .chm and .htm are supported as help files. public int ShowHelp(IntPtr hwnd, string pszHelpFile, uint uCommand, uint dwData, POINT ptMouse, object pDispatchObjectHit) { return Constants.S_OK; // S_OK Host displayed its UI. MSHTML does not display its message box. } #region Implementation of IServiceProvider public int QueryService(ref Guid guidService, ref Guid riid, out IntPtr ppvObject) { if ((guidService == Constants.IID_INewWindowManager && riid == Constants.IID_INewWindowManager)) { ppvObject = Marshal.GetComInterfaceForObject(_manager, typeof(INewWindowManager)); if (ppvObject != IntPtr.Zero) { return Constants.S_OK; } } ppvObject = IntPtr.Zero; return Constants.E_NOINTERFACE; } #endregion } } [ComVisible(true)] [Guid("01AFBFE2-CA97-4F72-A0BF-E157038E4118")] public class NewWindowManager : INewWindowManager { public int EvaluateNewWindow(string pszUrl, string pszName, string pszUrlContext, string pszFeatures, bool fReplace, uint dwFlags, uint dwUserActionTime) { // use E_FAIL to be the same as CoInternetSetFeatureEnabled with FEATURE_WEBOC_POPUPMANAGEMENT //int hr = MyBrowser.Constants.E_FAIL; int hr = MyBrowser.Constants.S_FALSE; //Block //int hr = MyBrowser.Constants.S_OK; //Allow all return hr; } } 

InjectAlertBlocker – абсолютно правильный код.

 private void InjectAlertBlocker() { HtmlElement head = webBrowser1.Document.GetElementsByTagName("head")[0]; HtmlElement scriptEl = webBrowser1.Document.CreateElement("script"); IHTMLScriptElement element = (IHTMLScriptElement)scriptEl.DomElement; string alertBlocker = "window.alert = function () { }"; element.text = alertBlocker; head.AppendChild(scriptEl); } 

Необходимо добавить ссылки

  1. Добавьте ссылку на MSHTML , которая, вероятно, будет называться « Microsoft HTML Object Library » в ссылках COM .

  2. Добавьте using mshtml; на ваши пространства имен.

  3. Получите ссылку на элемент IHTMLElement вашего элемента IHTMLElement :

Затем вы можете использовать Navigated событие веб-браузера как:

 private void InjectAlertBlocker() { HtmlElement head = webBrowser1.Document.GetElementsByTagName("head")[0]; HtmlElement scriptEl = webBrowser1.Document.CreateElement("script"); IHTMLScriptElement element = (IHTMLScriptElement)scriptEl.DomElement; string alertBlocker = "window.alert = function () { }"; element.text = alertBlocker; head.AppendChild(scriptEl); } private void webDest_Navigated(object sender, WebBrowserNavigatedEventArgs e) { InjectAlertBlocker(); } 

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

У меня были большие проблемы с этим: загрузка веб-страницы, предназначенной для печати, и отображает раздражающий диалог печати. 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" }); 

Мне удалось ввести код выше, создав расширенный class 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 ); } } 

Просто из свойств управления браузером: scriptErrorSupressed = true

Самый простой способ сделать это: В: Webbrowser Control у вас есть процедура (стандартная) BeforeScriptExecute

(Параметр для BeforeScriptExecutepdispwindow )

Добавь это :

 pdispwindow.execscript("window.alert = function () { }") 

Таким образом, перед выполнением любого скрипта в окне windows предупреждение будет подавлено с помощью введенного кода.

  • Перенос слов для ярлыка в Windows Forms
  • Панель c # для рисования графики и прокрутки
  • UI Design Pattern для Windows Forms (например, MVVM для WPF)
  • Как правильно использовать LogonUser для олицетворения пользователя домена из клиента рабочей группы
  • Правильная локализация приложения WinForms
  • Проверка подлинности WinForm UI
  • Создание динамической кнопки и размещение их в предопределенном порядке с использованием c #
  • Уместно ли распространять Control для обеспечения неизменно безопасной функции Invoke / BeginInvoke?
  • Кнопка внутри текстового windows winforms
  • Предотвратить отображение windows безопасности Windows
  • Приложение C # Windows Forms - обновление GUI из другого streamа и classа?
  • Давайте будем гением компьютера.