提问人:Sylverdrag 提问时间:4/26/2009 最后编辑:Ashkan Mobayen KhiabaniSylverdrag 更新时间:9/6/2022 访问量:543940
将 .NET WebBrowser 控件替换为更好的浏览器(如 Chrome)?[关闭]
Replacing .NET WebBrowser control with a better browser, like Chrome? [closed]
问:
我们不允许提出有关书籍、工具、软件库等建议的问题。您可以编辑问题,以便用事实和引文来回答。
3年前关闭。
社群在 2 年前审查了是否重新打开这个问题,并关闭了这个问题:
原始关闭原因未解决
有没有一种相对简单的方法可以将现代浏览器插入 .NET 应用程序?
据我了解,该控件是 IE 的包装器,这不会成为问题,只是它看起来像是一个非常旧版本的 IE,所有这些都涉及 CSS 搞砸、潜在的安全风险(如果渲染引擎没有打补丁,我真的可以指望数以百万计的缓冲区溢出问题得到解决吗? 等问题。WebBrowser
我正在使用 Visual Studio C#(精简版 - 它在这里有什么区别吗?
我想在我的应用程序中集成一个好的 Web 浏览器。在某些情况下,我只是用它来处理用户注册过程,与我的网站的某些功能进行交互以及该顺序的其他事情,但我想到了另一个应用程序,需要更多的错误......控制。
我需要:
- 可以集成到我的应用程序的窗口(不是单独的窗口)内的浏览器
- 对 CSS、js 和其他 Web 技术的良好支持,与任何现代浏览器相媲美
- 基本的浏览器功能,如“导航”、“返回”、“重新加载”......
- 自由访问页面代码和输出。
我正在考虑 Chrome,因为它属于 BSD 许可证,但我对最新版本的 IE 同样满意。
我想尽可能地让事情变得简单。最好的办法是可以修补现有的控件,它已经完成了我需要的大约 70%,但我认为这是不可能的。WebBrowser
我找到了Mozilla(http://www.iol.ie/~locka/mozilla/control.htm)的activeX控件,但看起来是旧版本,所以不一定是改进。
我愿意接受建议
答:
如果您不知道,Chrome 会使用 Webkit(的一个分支),Safari 也使用它。以下是一些相同的问题:
webkit 版本并不像另一个答案所说的那样好,一个版本不再有效(谷歌代码版本),而 Mono 版本是实验性的。如果有人努力为它制作一个像样的 .NET 包装器,那就太好了,但这似乎不是任何人想做的事情——这很令人惊讶,因为它现在支持 HTML5 和 IE(8) 引擎所缺乏的许多其他功能。
更新 (2014)
有一个新的双重许可项目,允许您将 Chrome 嵌入到 .NET 应用程序中,称为 Awesomium。它带有一个 .NET API,但需要相当多的技巧来呈现(示例将浏览器窗口绘制到缓冲区,将缓冲区绘制为图像并在计时器上刷新)。
我认为这是 Origin 在《战地风云 3》中使用的浏览器。
更新 (2016)
现在有 DotnetBrowser,它是 Awesomium 的商业替代品。它基于 Chromium。
评论
查看 CefSharp .Net 绑定,这是我不久前开始的一个项目,值得庆幸的是,它被社区所接受并变成了一些美妙的东西。
该项目包装了 Chromium 嵌入式框架,并已用于许多主要项目,包括 Rdio 的 Windows 客户端、Windows 版 Facebook Messenger 和 Windows 版 Github。
它具有 WPF 和 Winforms 的浏览器控件,并具有大量功能和扩展点。基于 Chromium,它的速度也非常快。
从 NuGet 获取它:或dotnet add package CefSharp.Wpf
dotnet add package CefSharp.WinForms
查看示例并给出您的想法/反馈/拉取请求: https://github.com/cefsharp/CefSharp
BSD 许可
评论
您可以使用注册表来设置 Web 浏览器控件的 IE 版本。 转到:HKLM\SOFTWARE\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_BROWSER_EMULATION 并添加值为 browser_emulation 的“yourApplicationName.exe” 要查看browser_emulation值,请参阅链接:http://msdn.microsoft.com/en-us/library/ee330730%28VS.85%29.aspx#browser_emulation
评论
几天来,我一直在测试 C# Web 浏览器组件的替代品,这是我的列表:
1. 使用较新的 IE 版本 8,9:
Web 浏览器组件是 IE7 而不是 IE8?如何改变这一点?
优点:
- 运行它不需要太多工作
- 如果 IE9 支持一些 HTML5/CSS3,如果 IE10 支持,则完全支持
缺点:
- 目标计算机必须安装目标 IE 版本,IE10 在 Win7 上仍处于预览状态
这不需要太多工作,你可以获得一些HTML5和CSS3支持,尽管IE9缺乏一些最好的CSS3和HTML5功能。但我相信你可以让IE10以同样的方式运行。问题是目标系统必须安装 IE10,并且由于在 Windows 7 上仍处于预览状态,我建议不要安装它。
2. OpenWebKit夏普
OpenWebKitSharp 是基于 WebKit.NET 0.5 项目的 webkit 引擎的 .net 包装器。WebKit 是 Chrome/Safari 使用的布局引擎
优点:
- 积极开发
- HTML5/CSS3 支持
缺点:
- 许多功能未实现
- 不支持 x64(必须为 x86 生成应用)Doesn't support x64 (App must be built for x86)
OpenWebKit 非常好,尽管许多功能尚未实现,但我在 Visual Studio 中使用它时遇到了一些问题,它在这里抛出空对象引用,然后在设计模式下,存在一些 js 问题。使用它的每个人几乎都会立即注意到 js alert 什么都不做。mouseup、mousedown...等等不起作用,js拖放有bug等等。
我在安装它时也遇到了一些困难,因为它需要安装特定版本的 VC 可再发行组件,因此在异常后我查看了事件日志,找到了 VC 版本并安装了它。
3. 壁虎FX
优点:
- 适用于单声道
- 积极开发
- HTML5/CSS3 支持
缺点:
- D̶o̶e̶s̶n̶'̶t̶ ̶s̶u̶p̶p̶o̶r̶t̶ ̶x̶6̶4̶ ̶(̶A̶p̶p̶ ̶m̶u̶s̶t̶ ̶b̶e̶ ̶b̶u̶i̶l̶t̶ ̶f̶o̶r̶ ̶x̶8̶6̶)̶ - 请参阅下面的评论
GeckoFX 是一个跨平台的 Webrowser 控件,用于嵌入到 WinForms 应用程序中。这可以与 Windows 上的 .NET 和 Linux 上的 mono 一起使用。 Gecko 是 Firefox 使用的布局引擎。
我碰到了一些关于GeckoFX没有积极开发的信息,这是不正确的,当然它总是比Firefox落后一两个版本,但这是正常的,活动和控件本身给我留下了深刻的印象。它完成了我需要的一切,但我需要一些时间来运行它,这里有一个小教程来运行它:
- 下载 GeckoFx-Windows-16.0-0.2,在这里您可以检查是否有更新的 GeckoFX 可用
- 添加对两个下载的 dll 的引用
- 由于 GeckoFX 是您需要 XulRunner 的包装器,请前往版本列表查看您需要哪一个
- 现在我们知道我们需要哪个版本的 XulRunner,我们转到 Mozilla XulRunner 版本,转到版本文件夹 -> 运行时 -> xulrunner-(your_version).en-US.win32.zip,在我们的例子中是 xulrunner-16.0.en-US.win32.zip
- 解压缩所有内容并将所有文件复制到 bin\Debug(或释放 您的项目已设置为发布)
- 转到窗体的 Visual Studio 设计器,转到工具箱,右键单击内部 -> 选择项目 -> 浏览 -> 查找下载的 GeckoFX winforms dll 文件 ->确定
- 现在你应该有了新的控件 GeckoWebBrowser
如果你真的必须使用Chrome,看看这个叫做Awesomium的产品,它对非商业项目是免费的,但商业项目的许可证要几千美元。
评论
Geckofx 和 Webkit.net 起初都很有前途,但它们并没有分别跟上 Firefox 和 Chrome 的最新步伐,而随着 Internet Explorer 的改进,Web 浏览器控件也是如此,尽管它的行为默认类似于 IE7,无论您拥有什么 IE 版本,但这可以通过进入注册表并将其更改为允许 HTML5 的 IE9 来修复。
我知道这不是“替代”WebBrowser 控件,但是在显示使用 BootStrap 3+ 进行布局等的页面时,我遇到了一些可怕的渲染问题,然后我发现了一篇建议我使用以下内容的帖子。显然,它是特定于 IE 的,并告诉它使用在客户端机器上找到的最新变体进行渲染(因此它不会使用 IE7,我认为这是默认设置)。
所以就放:
<meta http-equiv="X-UA-Compatible" content="IE=Edge" />
在文档头部的某个位置。
显然,如果它不是您的文档,这将无济于事 - 尽管我个人认为如果您正在阅读不是通过 WebBrowser 控件自己创建的页面,这是一个安全漏洞 - 为什么不直接使用 Web 浏览器!
评论
<head>
<head>
<meta>
<head>
我遇到了同样的问题,WebBrowser 使用的是旧版本的 IE,通过一些谷歌搜索,我遇到了以下代码,这些代码对注册表进行了更改,并使 WebBrowser 尽可能使用最新的 IE 版本:
public enum BrowserEmulationVersion
{
Default = 0,
Version7 = 7000,
Version8 = 8000,
Version8Standards = 8888,
Version9 = 9000,
Version9Standards = 9999,
Version10 = 10000,
Version10Standards = 10001,
Version11 = 11000,
Version11Edge = 11001
}
public static class WBEmulator
{
private const string InternetExplorerRootKey = @"Software\Microsoft\Internet Explorer";
public static int GetInternetExplorerMajorVersion()
{
int result;
result = 0;
try
{
RegistryKey key;
key = Registry.LocalMachine.OpenSubKey(InternetExplorerRootKey);
if (key != null)
{
object value;
value = key.GetValue("svcVersion", null) ?? key.GetValue("Version", null);
if (value != null)
{
string version;
int separator;
version = value.ToString();
separator = version.IndexOf('.');
if (separator != -1)
{
int.TryParse(version.Substring(0, separator), out result);
}
}
}
}
catch (SecurityException)
{
// The user does not have the permissions required to read from the registry key.
}
catch (UnauthorizedAccessException)
{
// The user does not have the necessary registry rights.
}
return result;
}
private const string BrowserEmulationKey = InternetExplorerRootKey + @"\Main\FeatureControl\FEATURE_BROWSER_EMULATION";
public static BrowserEmulationVersion GetBrowserEmulationVersion()
{
BrowserEmulationVersion result;
result = BrowserEmulationVersion.Default;
try
{
RegistryKey key;
key = Registry.CurrentUser.OpenSubKey(BrowserEmulationKey, true);
if (key != null)
{
string programName;
object value;
programName = Path.GetFileName(Environment.GetCommandLineArgs()[0]);
value = key.GetValue(programName, null);
if (value != null)
{
result = (BrowserEmulationVersion)Convert.ToInt32(value);
}
}
}
catch (SecurityException)
{
// The user does not have the permissions required to read from the registry key.
}
catch (UnauthorizedAccessException)
{
// The user does not have the necessary registry rights.
}
return result;
}
public static bool SetBrowserEmulationVersion(BrowserEmulationVersion browserEmulationVersion)
{
bool result;
result = false;
try
{
RegistryKey key;
key = Registry.CurrentUser.OpenSubKey(BrowserEmulationKey, true);
if (key != null)
{
string programName;
programName = Path.GetFileName(Environment.GetCommandLineArgs()[0]);
if (browserEmulationVersion != BrowserEmulationVersion.Default)
{
// if it's a valid value, update or create the value
key.SetValue(programName, (int)browserEmulationVersion, RegistryValueKind.DWord);
}
else
{
// otherwise, remove the existing value
key.DeleteValue(programName, false);
}
result = true;
}
}
catch (SecurityException)
{
// The user does not have the permissions required to read from the registry key.
}
catch (UnauthorizedAccessException)
{
// The user does not have the necessary registry rights.
}
return result;
}
public static bool SetBrowserEmulationVersion()
{
int ieVersion;
BrowserEmulationVersion emulationCode;
ieVersion = GetInternetExplorerMajorVersion();
if (ieVersion >= 11)
{
emulationCode = BrowserEmulationVersion.Version11;
}
else
{
switch (ieVersion)
{
case 10:
emulationCode = BrowserEmulationVersion.Version10;
break;
case 9:
emulationCode = BrowserEmulationVersion.Version9;
break;
case 8:
emulationCode = BrowserEmulationVersion.Version8;
break;
default:
emulationCode = BrowserEmulationVersion.Version7;
break;
}
}
return SetBrowserEmulationVersion(emulationCode);
}
public static bool IsBrowserEmulationSet()
{
return GetBrowserEmulationVersion() != BrowserEmulationVersion.Default;
}
}
你只需要创建一个类并将这段代码放入其中,然后在程序启动时运行以下代码:
if (!WBEmulator.IsBrowserEmulationSet())
{
WBEmulator.SetBrowserEmulationVersion();
}
VB.NET:
Imports Microsoft.Win32
Imports System
Imports System.Collections.Generic
Imports System.IO
Imports System.Linq
Imports System.Security
Imports System.Text
Imports System.Threading.Tasks
Public Enum BrowserEmulationVersion
[Default] = 0
Version7 = 7000
Version8 = 8000
Version8Standards = 8888
Version9 = 9000
Version9Standards = 9999
Version10 = 10000
Version10Standards = 10001
Version11 = 11000
Version11Edge = 11001
End Enum
Public Class WBEmulator
Private Const InternetExplorerRootKey As String = "Software\Microsoft\Internet Explorer"
Public Shared Function GetInternetExplorerMajorVersion() As Integer
Dim result As Integer
result = 0
Try
Dim key As RegistryKey
key = Registry.LocalMachine.OpenSubKey(InternetExplorerRootKey)
If key IsNot Nothing Then
Dim value As Object = If(key.GetValue("svcVersion", Nothing), key.GetValue("Version", Nothing))
Dim Version As String
Dim separator As Integer
Version = value.ToString()
separator = Version.IndexOf(".")
If separator <> -1 Then
Integer.TryParse(Version.Substring(0, separator), result)
End If
End If
Catch ex As SecurityException
'The user does Not have the permissions required to read from the registry key.
Catch ex As UnauthorizedAccessException
'The user does Not have the necessary registry rights.
Catch
End Try
GetInternetExplorerMajorVersion = result
End Function
Private Const BrowserEmulationKey = InternetExplorerRootKey + "\Main\FeatureControl\FEATURE_BROWSER_EMULATION"
Public Shared Function GetBrowserEmulationVersion() As BrowserEmulationVersion
Dim result As BrowserEmulationVersion
result = BrowserEmulationVersion.Default
Try
Dim key As RegistryKey = Registry.CurrentUser.OpenSubKey(BrowserEmulationKey, True)
If key IsNot Nothing Then
Dim programName As String
Dim value As Object
programName = Path.GetFileName(Environment.GetCommandLineArgs()(0))
value = key.GetValue(programName, Nothing)
If value IsNot Nothing Then
result = CType(Convert.ToInt32(value), BrowserEmulationVersion)
End If
End If
Catch ex As SecurityException
'The user does Not have the permissions required to read from the registry key.
Catch ex As UnauthorizedAccessException
'The user does Not have the necessary registry rights.
Catch
End Try
GetBrowserEmulationVersion = result
End Function
Public Shared Function SetBrowserEmulationVersion(BEVersion As BrowserEmulationVersion) As Boolean
Dim result As Boolean = False
Try
Dim key As RegistryKey = Registry.CurrentUser.OpenSubKey(BrowserEmulationKey, True)
If key IsNot Nothing Then
Dim programName As String = Path.GetFileName(Environment.GetCommandLineArgs()(0))
If BEVersion <> BrowserEmulationVersion.Default Then
'if it's a valid value, update or create the value
key.SetValue(programName, CType(BEVersion, Integer), RegistryValueKind.DWord)
Else
'otherwise, remove the existing value
key.DeleteValue(programName, False)
End If
result = True
End If
Catch ex As SecurityException
' The user does Not have the permissions required to read from the registry key.
Catch ex As UnauthorizedAccessException
' The user does Not have the necessary registry rights.
End Try
SetBrowserEmulationVersion = result
End Function
Public Shared Function SetBrowserEmulationVersion() As Boolean
Dim ieVersion As Integer
Dim emulationCode As BrowserEmulationVersion
ieVersion = GetInternetExplorerMajorVersion()
If ieVersion >= 11 Then
emulationCode = BrowserEmulationVersion.Version11
Else
Select Case ieVersion
Case 10
emulationCode = BrowserEmulationVersion.Version10
Case 9
emulationCode = BrowserEmulationVersion.Version9
Case 8
emulationCode = BrowserEmulationVersion.Version8
Case Else
emulationCode = BrowserEmulationVersion.Version7
End Select
End If
SetBrowserEmulationVersion = SetBrowserEmulationVersion(emulationCode)
End Function
Public Shared Function IsBrowserEmulationSet() As Boolean
IsBrowserEmulationSet = GetBrowserEmulationVersion() <> BrowserEmulationVersion.Default
End Function
End Class
您可以像这样使用它:
If Not WBEmulator.IsBrowserEmulationSet() Then
WBEmulator.SetBrowserEmulationVersion()
End If
评论
2020年7月更新
基于 Chromium 的 WebView 2 由 Microsoft 发布。现在,您可以将新的 Chromium Edge 浏览器嵌入到 .NET 应用程序中。
更新 2018 5 月
如果你的目标是在 Windows 10 或更高版本上运行的应用程序,那么现在你可以使用 Windows 社区工具包将 Edge 浏览器嵌入到 .NET 应用程序中。
WPF 示例:
安装 Windows 社区工具包 Nuget 包
Install-Package Microsoft.Toolkit.Win32.UI.Controls
XAML 代码
<Window x:Class="WebViewTest.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:WPF="clr-namespace:Microsoft.Toolkit.Win32.UI.Controls.WPF;assembly=Microsoft.Toolkit.Win32.UI.Controls" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:local="clr-namespace:WebViewTest" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" Title="MainWindow" Width="800" Height="450" mc:Ignorable="d"> <Grid> <WPF:WebView x:Name="wvc" /> </Grid> </Window>
CS 代码:
public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); // You can also use the Source property here or in the WPF designer wvc.Navigate(new Uri("https://www.microsoft.com")); } }
WinForms 示例:
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
// You can also use the Source property here or in the designer
webView1.Navigate(new Uri("https://www.microsoft.com"));
}
}
有关详细信息,请参阅此链接。
评论
WebBrowser
FEATURE_BROWSER_EMULATION