How do I suppress script errors when using the WPF WebBrowser control?

前端 未结 8 1813
余生分开走
余生分开走 2020-12-02 09:34

I have a WPF application that uses the WPF WebBrowser control to display interesting web pages to our developers on a flatscreen display (like a news feed).

The tro

8条回答
  •  暗喜
    暗喜 (楼主)
    2020-12-02 10:36

    Here is a solution i just made with reflection. Solves the issue :) I run it at the Navigated event, as it seems the activeX object is not available until then.

    What it does is set the .Silent property on the underlying activeX object. Which is the same as the .ScriptErrorsSuppressed property which is the Windows forms equivalent.

     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 });
     }
    

    A better version that can be run anytime and not after the .Navigated event:

    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 });
    }
    

    If any issues with the second sample, try swapping wb.Loaded with wb.Navigated.

提交回复
热议问题