如何使WebBrowser控件显示现代内容?

16

我创建了一个使用WebBrowser控件的Winforms应用程序;我动态地分配它的Uri。一段时间内它运行得很好,但现在我收到了以下消息:

您似乎正在使用不受支持的浏览器。旧浏览器可能会危及您的安全性,速度慢,并且无法使用较新的Google Maps功能。要访问Google Maps,您需要更新到现代浏览器。

最后两个字是一个链接,点击该链接,我看到:

您目前使用的是... IE 11

所以,好吧,WebBrowser组件使用IE 11;如何更改它?

我的机器设置为使用Chrome作为其浏览器;也许该控件应该使用您当前的浏览器?我不知道是否可能/可行。

更新

好的,我愿意尝试Reza的建议。但是,当我导航到regedit中的指定位置,并右键单击右窗格以添加新条目时,它有三个选项:

键、字符串值、二进制值

我认为字符串值是".exe"字符串,而二进制值是"dword"值,但是"键"值应该是什么?


你能使用IE 11浏览URL吗?(我的意思是iexplore.exe而不是Web浏览器控件。) - Reza Aghaei
是的,它只是突然不听使唤了。 - B. Clay Shannon-B. Crow Raven
请看下面的答案。 - Reza Aghaei
另一个解决方案是完全放弃WebBrowser/IE,改用CefSharp,它是Chromium的包装器。 请参见此处以获取最简示例。 - George Vovos
4个回答

49

注意: 本文说的是WebBrowser控件,但对于所有新的.NET项目,主要解决方案是使用WebView2。欲了解更多信息,请参阅此帖子:

WebBrowser 控件

WebBrowser控件使用已安装在您的操作系统上的同一版本 Internet Explorer,但默认情况下不使用最新的文档模式并以兼容模式显示内容。

症状 - 作为症状,在Internet Explorer或其他浏览器中网站正常工作,但WebBrowser控件不能良好地显示该网站,对于某些网站它会显示脚本错误。

解决方案 - 您可以告诉WebBrowser控件使用不带兼容模式的最新文档模式。您可以按照这里的说明使用注册表禁用设置。[参考: 浏览器仿真]

使用代码应用浏览器仿真设置

如果您想使用代码应用设置,请运行以下代码:

using (var key = Microsoft.Win32.Registry.CurrentUser.OpenSubKey(
    @"Software\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_BROWSER_EMULATION",
    true))
{
    var app = System.IO.Path.GetFileName(Application.ExecutablePath);
    key.SetValue(app, 11001, Microsoft.Win32.RegistryValueKind.DWord);
    key.Close();
}

在上述代码中,我使用了11001表示IE11 Edge模式。

Internet Explorer 11。网页以IE11 Edge模式显示,无论声明了什么类型的指令。如果未声明指令,则页面将以Quirks模式加载。

手动应用浏览器仿真设置

打开注册表编辑器并浏览HKEY_CURRENT_USER,转到以下键:

Software\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_BROWSER_EMULATION

添加以下数值:

"YourApplicationFileName.exe"=dword:00002af9
"YourApplicationFileName.vshost.exe"=dword:00002af9

(在旧版本的Visual Studio中,当您在Visual Studio中运行程序时,您需要添加vshost.exe值。)

要创建条目,请右键单击右窗格的空白区域,然后在选择dword值后出现的窗口中,选择十六进制并输入2af9

enter image description here

在上述步骤中,我使用了11001,这意味着IE11 Edge模式。

为Windows Forms使用WebViewCompatible控件

您还可以使用新的WebViewCompatible控件用于Windows Forms。您可以在此处查看使用简单的步骤:用Windows Forms的新WebView Compatible控件替换WebBrowser控件

WebViewCompatible使用两个渲染引擎之一来支持更广泛的Windows客户端:

  • 在运行Windows 10的设备上,使用较新的Microsoft Edge渲染引擎来嵌入视图,从远程Web服务器、动态生成的代码或内容文件中呈现丰富格式的HTML内容。

  • 在运行旧版Windows的设备上,使用System.Windows.Controls.WebBrowser,它提供基于Internet Explorer引擎的呈现。

  • 注意:WebView2WebViewWebViewCompatible的替代品。

设置X-UA-Compatible元标记

如果您可以访问页面的html内容并且可以更改内容(例如它是一个本地html文件或网站属于您自己),那么您可以在中设置X-UA-Compatible元标记,如:<meta http-equiv="X-UA-Compatible" content="IE=Edge" />

使用其他浏览器控件

您可以依赖其他浏览器控件,比如CefSharp


1
通常情况下,使用IE的Edge模式可以解决脚本和样式错误的问题。这样,网站将把您的浏览器代理识别为IE 11 Edge模式。 - Reza Aghaei
请查看我的更新。 - B. Clay Shannon-B. Crow Raven
1
太好了!您可以将此解决方案应用于在IE浏览器中正常但在WebBrowser控件中无法正确显示的情况。顺便说一句,如果您要在客户机上分发应用程序,请不要忘记使用安装程序或使用您的代码执行此任务。 - Reza Aghaei
1
谢谢赏金!我喜欢你赚取和使用声望分数的方式! - Reza Aghaei
@RezaAghaei 请编辑你的第一个代码片段,将Close()和Dispose()方法调用到key对象上(对于Dispose方法最好使用using()模式)。至少,在代码片段下方添加一条注释,提醒任何复制你代码片段的人应该调用Close()和Dispose()方法(对于那些将其粘贴入生产代码的人来说)。 - Eric
显示剩余5条评论

9
在我的应用程序中,我使用嵌入式自定义协议,只允许浏览应用程序提供的页面,不允许从外部获取内容,因此我希望跳过保存到Windows注册表中。在按照Reza Aghaei的回答进行测试后,我发现您可以从内容页面内更改兼容性模式。这将跳过配置注册表键的需要,但您必须将其添加到每个页面中。
要更改页面的兼容性模式,必须添加一个元标记以使渲染引擎应用它。
<html>
    <head>
        <meta http-equiv="X-UA-Compatible" content="IE=Edge" />
    </head>
    <body>
    ...
    </body>
</html>

2
以下步骤将添加正确的密钥并将其删除。 在加载包含Web浏览器的表单时,请调用CreateBrowserKey。 然后在关闭表单时,调用RemoveBrowserKey。
Private Sub CreateBrowserKey(Optional ByVal IgnoreIDocDirective As Boolean = False)
    '      Dim basekey As String = Microsoft.Win32.Registry.CurrentUser.ToString
    Dim value As Int32
    '       Dim thisAppsName As String = My.Application.Info.AssemblyName & ".exe"

    ' Value reference: http://msdn.microsoft.com/en-us/library/ee330730%28v=VS.85%29.aspx
    ' IDOC Reference:  http://msdn.microsoft.com/en-us/library/ms535242%28v=vs.85%29.aspx
    Select Case (New WebBrowser).Version.Major
        Case 8
            If IgnoreIDocDirective Then
                value = 8888
            Else
                value = 8000
            End If
        Case 9
            If IgnoreIDocDirective Then
                value = 9999
            Else
                value = 9000
            End If
        Case 10
            If IgnoreIDocDirective Then
                value = 10001
            Else
                value = 10000
            End If
        Case 11
            If IgnoreIDocDirective Then
                value = 11001
            Else
                value = 11000
            End If

        Case Else
            Exit Sub
    End Select
    Microsoft.Win32.Registry.SetValue(Microsoft.Win32.Registry.CurrentUser.ToString & BrowserKeyPath, _
                                              Process.GetCurrentProcess.ProcessName & ".exe", _
                                              value, _
                                              Microsoft.Win32.RegistryValueKind.DWord)
End Sub

Private Sub RemoveBrowserKey()
    Dim key As Microsoft.Win32.RegistryKey
    key = Microsoft.Win32.Registry.CurrentUser.OpenSubKey(BrowserKeyPath.Substring(1), True)
    key.DeleteValue(Process.GetCurrentProcess.ProcessName & ".exe", False)
End Sub

1

C# 的 WebBrowser 类是 Internet Explorer 的封装,因此无法更改。

请参见this链接:

WebBrowser 控件是安装在 Internet Explorer 中的一个托管包装器。

如果要寻找替代方案,可以查看以下内容。

WebKit.NET

GeckoFX


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接