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

Posted

技术标签:

【中文标题】如何让 WebBrowser 控件显示现代内容?【英文标题】:How can I get the WebBrowser control to show modern contents? 【发布时间】:2016-11-25 15:12:26 【问题描述】:

我创建了一个使用 WebBrowser 控件的 Winforms 应用程序;我动态分配它的 Uri。它工作了一段时间,但现在我收到了这个消息:

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

最后两个词是一个链接,在那个链接之后,我看到了:

您当前正在使用... IE 11

所以,好吧,WebBrowser 组件使用 IE 11;我该如何改变呢?

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

更新

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

键、字符串值、二进制值

我认为字符串值是“.exe”字符串,二进制值是“dword”值,但“Key”值应该是什么?

【问题讨论】:

可以用IE 11浏览网址吗? (我的意思是 iexplore.exe 不是网络浏览器控件。) 是的;只是控制突然停止了。 那么看看下面的答案吧。 另一种解决方案是完全放弃 WebBrowser/IE 并使用 CefSharp 这是 Chromium 的包装器。有关最小示例,请参阅 here 【参考方案1】:

注意:这篇文章是关于 WebBrowser 控制的,但是,对于所有新的 .NET 项目的主要解决方案正在使用 WebView2。 要了解更多信息,请查看此帖子:

Getting started with WebView2.

网页浏览器控件

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

症状 - 作为症状,该站点在 Internet Explorer 或其他浏览器中正常运行,但 WebBrowser 控件无法很好地显示该站点,并且对于某些站点,它会显示脚本错误。 p>

解决方案 - 您可以在WebBrowser 控件中告诉WebBrowser 控件使用不兼容模式的最新文档模式。您可以按照说明here 使用注册表禁用该设置。 [参考:Browser Emulation]

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

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

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 边缘模式显示, 无论声明的 !DOCTYPE 指令如何。未能申报 !DOCTYPE 指令导致页面以 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

在上述步骤中,我使用了11001,即 IE11 Edge 模式。

为 Windows 窗体使用 WebViewCompatible 控件

您也可以使用新的WebViewCompatible control for Windows Forms。您可以在此处查看使用的简单步骤:Replace WebBrowser control by new WebView Compatible control for Windows Forms。

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

在 Windows 10 设备上,较新的 Microsoft Edge 呈现引擎用于嵌入一个视图,该视图呈现来自远程 Web 服务器、动态生成的代码或内容文件的格式丰富的 html 内容。

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

注意:WebView2WebVeiwWebViewCompatible 的替代品。

设置 X-UA-Compatibile 元标记

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

使用其他浏览器控件

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

【讨论】:

一般使用IE的edge模式来解决脚本和样式错误的问题。这样,网站会将您的代理检测为 IE 11 边缘模式。 请看我的更新。 在帖子中查看图片。 太棒了!您可以将此解决方案应用于站点在 IE 浏览器中正常但在 WebBrowser 控件中未正确显示的情况。顺便说一句,如果您在客户端计算机上分发应用程序,请不要忘记使用安装程序或使用您的代码执行此类任务。 感谢您的赏金!我喜欢你赚取和花费声望分数的方式!【参考方案2】:

对于应用程序上的嵌入式自定义协议,我将只允许浏览应用程序提供的页面,而不允许浏览外部内容,因此我想跳过保存到 Windows 注册表。当我按照 Reza Aghaei 的回答进行测试时,发现您可以从内容页面中更改兼容模式。这将跳过配置注册表项的需要,但您必须将其添加到每个页面。

要更改页面的兼容模式,您必须添加一个元标记以供渲染引擎应用:

<html>
    <head>
        <meta http-equiv="X-UA-Compatible" content="IE=Edge" />
    </head>
    <body>
    ...
    </body>
</html>

【讨论】:

【参考方案3】:

以下过程将添加正确的密钥并再次将其删除。 在加载 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

【讨论】:

【参考方案4】:

C# WebBrowser 类基本上是一个 IE 包装器,因此无法更改。

见this链接:

WebBrowser 控件是使用 Internet Explorer 安装的组件的托管包装器。

您可以查看替代方案

WebKit.NET

GeckoFX

【讨论】:

以上是关于如何让 WebBrowser 控件显示现代内容?的主要内容,如果未能解决你的问题,请参考以下文章

如何将字符串 html 内容显示到 webbrowser 控件中?

如何让webbrowser控件支持Html5

如何在 C# 中更新 WebBrowser 控件中的 DOM 内容?

Delphi用WebBrowser控件定制浏览器,如何控制不让下载网页中的图像或Flash或背景音乐之类的东西?

托管 WebBrowser 控件尝试下载 Flash 内容而不是播放它

delphi webbrowser,如何调整webbrowser里面打开网页的大小,或者使打开的内容适应webbrowser控件的大小。