如何让 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 引擎的呈现。
注意:WebView2
是WebVeiw
和WebViewCompatible
的替代品。
设置 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 控件中?
如何在 C# 中更新 WebBrowser 控件中的 DOM 内容?
Delphi用WebBrowser控件定制浏览器,如何控制不让下载网页中的图像或Flash或背景音乐之类的东西?
托管 WebBrowser 控件尝试下载 Flash 内容而不是播放它
delphi webbrowser,如何调整webbrowser里面打开网页的大小,或者使打开的内容适应webbrowser控件的大小。