wpf browser

¿Cómo suprimo los errores de script cuando uso el control WPF WebBrowser?



(9)

Acabo de encontrar de otra pregunta , esto es elegante y funciona muy bien.

dynamic activeX = this.webBrowser1.GetType().InvokeMember("ActiveXInstance", BindingFlags.GetProperty | BindingFlags.Instance | BindingFlags.NonPublic, null, this.webBrowser1, new object[] { }); activeX.Silent = true;

Tengo una aplicación WPF que utiliza el control WPF WebBrowser para mostrar páginas web interesantes a nuestros desarrolladores en una pantalla plana (como una fuente de noticias).

El problema es que ocasionalmente recibo un error de script HTML que muestra un desagradable mensaje de error de IE que me pregunta si me gustaría "dejar de ejecutar scripts en esta página". ¿Hay alguna manera de suprimir esta comprobación de errores?

NOTA: Ya he desactivado la depuración de scripts en la configuración de IE.


Aquí hay una solución que acabo de hacer con reflexión. Resuelve el problema :) Lo ejecuto en el evento Navegado, ya que parece que el objeto activeX no está disponible hasta entonces.

Lo que hace es establecer la propiedad .Silent en el objeto activo subyacente. Que es lo mismo que la propiedad .ScriptErrorsSuppressed que es el equivalente a Windows Forms.

public void HideScriptErrors(WebBrowser wb, bool Hide) { FieldInfo fiComWebBrowser = typeof(WebBrowser).GetField("_axIWebBrowser2", BindingFlags.Instance | BindingFlags.NonPublic); if (fiComWebBrowser == null) return; object objComWebBrowser = fiComWebBrowser.GetValue(wb); if (objComWebBrowser == null) return; objComWebBrowser.GetType().InvokeMember("Silent", BindingFlags.SetProperty, null, objComWebBrowser, new object[] { Hide }); }

Una mejor versión que se puede ejecutar en cualquier momento y no después del evento .Navigated:

public void HideScriptErrors(WebBrowser wb, bool hide) { var fiComWebBrowser = typeof(WebBrowser).GetField("_axIWebBrowser2", BindingFlags.Instance | BindingFlags.NonPublic); if (fiComWebBrowser == null) return; var objComWebBrowser = fiComWebBrowser.GetValue(wb); if (objComWebBrowser == null) { wb.Loaded += (o, s) => HideScriptErrors(wb, hide); //In case we are to early return; } objComWebBrowser.GetType().InvokeMember("Silent", BindingFlags.SetProperty, null, objComWebBrowser, new object[] { hide }); }

Si hay problemas con la segunda muestra, intente intercambiar wb.Loaded con wb.Navigated.


Compruebe el siguiente código para suprimir los errores de script para el control del navegador WPF.

public MainWindow { InitializeComponent(); WebBrowserControlView.Navigate(new Uri("https://www.hotmail.com")); //The below checks for script errors. ViewerWebBrowserControlView.Navigated += ViewerWebBrowserControlView_Navigated; } void ViewerWebBrowserControlView_Navigated(object sender, NavigationEventArgs e) { BrowserHandler.SetSilent(ViewerWebBrowserControlView, true); // make it silent } public static class BrowserHandler { private const string IWebBrowserAppGUID = "0002DF05-0000-0000-C000-000000000046"; private const string IWebBrowser2GUID = "D30C1661-CDAF-11d0-8A3E-00C04FC9E26E"; public static void SetSilent(System.Windows.Controls.WebBrowser browser, bool silent) { if (browser == null) MessageBox.Show("No Internet Connection"); // get an IWebBrowser2 from the document IOleServiceProvider sp = browser.Document as IOleServiceProvider; if (sp != null) { Guid IID_IWebBrowserApp = new Guid(IWebBrowserAppGUID); Guid IID_IWebBrowser2 = new Guid(IWebBrowser2GUID); object webBrowser; sp.QueryService(ref IID_IWebBrowserApp, ref IID_IWebBrowser2, out webBrowser); if (webBrowser != null) { webBrowser.GetType().InvokeMember("Silent", BindingFlags.Instance | BindingFlags.Public | BindingFlags.PutDispProperty, null, webBrowser, new object[] { silent }); } } } } [ComImport, Guid("6D5140C1-7436-11CE-8034-00AA006009FA"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] public interface IOleServiceProvider { [PreserveSig] int QueryService([In] ref Guid guidService, [In] ref Guid riid, [MarshalAs(UnmanagedType.IDispatch)] out object ppvObject); }

Mientras que, si está utilizando el navegador web Winforms con el host de winforms ... tiene una propiedad "SuppressScriptErrors" configurado en true

<WindowsFormsHost Name="WinformsHost" Grid.Row="1"> <winForms:WebBrowser x:Name="WebBrowserControlView" ScriptErrorsSuppressed="True" AllowWebBrowserDrop="False"></winForms:WebBrowser> </WindowsFormsHost>



Quería agregar esto como un comentario a la respuesta de @Alkampfer, pero no tengo suficiente reputación. Esto funciona para mí (Windows 8.1, NET 4.5):

window.Browser.LoadCompleted.Add(fun _ -> window.Browser.Source <- new System.Uri("javascript:window.onerror=function(msg,url,line){return true;};void(0);"))

Este ejemplo de código está escrito en F #, pero está bastante claro qué hace.


También encontré una forma interesante de deshabilitar los errores de JavaScript. Pero debe usar al menos .Net Framework 4.0 debido a que utiliza un tipo dinámico elegante.

Debe suscribirse al evento LoadCompleted del elemento WebBrowser:

<WebBrowser x:Name="Browser" LoadCompleted="Browser_OnLoadCompleted" />

Después de eso, debe escribir un controlador de eventos que se ve a continuación:

void Browser_OnLoadCompleted(object sender, NavigationEventArgs e) { var browser = sender as WebBrowser; if (browser == null || browser.Document == null) return; dynamic document = browser.Document; if (document.readyState != "complete") return; dynamic script = document.createElement("script"); script.type = @"text/javascript"; script.text = @"window.onerror = function(msg,url,line){return true;}"; document.head.appendChild(script); }



puedes usar este truco

vb.net

Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Integer, ByVal wMsg As Integer, ByVal wParam As Integer, ByVal lParam As Integer) As Integer Private Const WM_CLOSE As Short = &H10s

y llame a la última lib:

dim hwnd dim vreturnvalue hwnd = FindWindow(vbNullString,"script error") if hwnd<>0 then vreturnvalue = SendMessage(hwnd, WM_CLOSE, &O0s, &O0s)


El problema aquí es que WPF WebBrowser no implementó esta propiedad como en el control 2.0.

Su mejor opción es usar un WindowsFormsHost en su aplicación WPF y usar la propiedad WebBrowser del 2.0: SuppressScriptErrors . Incluso entonces, necesitarás que la aplicación sea de plena confianza para poder hacer esto.

No es lo que uno llamaría ideal, pero es prácticamente la única opción actualmente.