85

我最近升级到 IE9-beta。现在,在我的 .Net (3.5) WinForm 应用程序中,我想使用WebBrowser控件。

所以我的问题是,WebBrowser控件是否会展现 IE9 的所有属性和功能?

我担心的是,我想在上面渲染一些 SVG 图形。

4

12 回答 12

129

WebBrowser 控件将使用您安装的任何版本的 IE,但出于兼容性原因,它将默认以 IE7 标准模式呈现页面。

如果您想利用新的 IE9 功能,您应该在HTML 页面 <meta http-equiv="X-UA-Compatible" content="IE=9" >的标签内添加元标签。<head>

这个元标记必须在任何指向 CSS、JavaScript 文件等的链接之前添加,这些链接也可以<head>正常工作(只有其他<meta>标记或<title>标记可以在它之前)。

另一种方法是将注册表项添加到:

HKLM > SOFTWARE > Microsoft > Internet Explorer > Main > FeatureControl > FEATURE_BROWSER_EMULATION

并在其中添加值为“9000”的“myApplicationName.exe”以强制 WebBrowser 控件以 IE9 模式显示页面。尽管您也可以使用其他值,但请注意,这些文档并不完全准确,因为无论您使用什么值,似乎都不可能让页面在 IE 8 模式下呈现。

将注册表项添加到 HKCU 而不是 HKLM 中的同一路径也将起作用 - 这很有用,因为写入 HKLM 需要管理员权限,而 HKCU 不需要。

于 2011-01-06T08:23:14.553 回答
83

WebBrowser控件的IE9“版本”,和IE8版本一样,实际上是几个浏览器合二为一。与 IE8 版本不同,您可以通过更改 doctype 对页面内的呈现模式进行更多控制。当然,要更改浏览器模式,您必须像之前的答案一样设置注册表。这是 FEATURE_BROWSER_EMULATION 的 reg 文件片段:

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_BROWSER_EMULATION]
"contoso.exe"=dword:00002328

这是完整的代码集:

  • 9999 (0x270F) - Internet Explorer 9。无论 !DOCTYPE 指令如何,网页都以 IE9 标准模式显示。
  • 9000 (0x2328) - Internet Explorer 9。包含基于标准的 !DOCTYPE 指令的网页以 IE9 模式显示。
  • 8888 (0x22B8) - 网页以 IE8 标准模式显示,与 !DOCTYPE 指令无关。
  • 8000 (0x1F40) - 包含基于标准的 !DOCTYPE 指令的网页以 IE8 模式显示。
  • 7000 (0x1B58) - 包含基于标准的 !DOCTYPE 指令的网页以 IE7 标准模式显示。

完整的文档:

http://msdn.microsoft.com/en-us/library/ee330730%28VS.85%29.aspx#browser_emulation

于 2011-03-18T19:55:16.050 回答
26

谢天谢地,我找到了这个。以下是极其重要的:

<meta http-equiv="X-UA-Compatible" content="IE=9" >

没有这个,我生成的报告在 IE9 安装后都不会起作用,尽管在 IE8 中运行良好。它们会在 Web 浏览器控件中正确显示,但是当我调用 .Print() 时,会出现字母丢失、空格被抬高等情况。它们只是基本的 HTML,即使在 Mosaic 中也应该能够呈现。呵呵 不知道为什么 IE7 兼容模式会变得混乱。值得注意的是,您可以 .Print() 5 次相同的页面,并且每次都缺少不同的字母。它甚至会延续到 PDF 输出中,所以它绝对是浏览器。

于 2011-03-15T17:15:15.733 回答
17

关于 64 位 Windows 的注释似乎让一些人感到困惑。如果您的应用在 64 位 Windows 下运行,您可能需要在 [HKLM\SOFTWARE\Wow6432Node\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_BROWSER_EMULATION] 下设置 DWORD。

于 2012-09-15T14:44:01.997 回答
16

只是为了完整...

对于 32 位操作系统,您必须将注册表项添加到:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Internet Explorer\MAIN\FeatureControl\FEATURE_BROWSER_EMULATION

*******或者*******

对于 64 位操作系统,您必须将注册表项添加到:

HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Internet Explorer\MAIN\FeatureControl\FEATURE_BROWSER_EMULATION

该条目必须是一个DWORD,名称是您的可执行文件的名称,它承载 Webbrowser 控件;IE:

myappname.exe(不要使用 MSDN 网页中的“Contoso.exe”...它只是一个占位符名称)

然后DWORD根据下表给它一个值:

http://msdn.microsoft.com/en-us/library/ee330730(v=vs.85).aspx#browser_emulation

我更改为十进制 11001 或十六进制 0x2AF9 ---(IE 11 EMULATION),因为这不是默认值(如果您安装了 IE 11 或任何版本)。

该 MSDN 文章包含有关影响 Internet Explorer Web 浏览器行为的其他几个注册表更改的注释。

于 2014-01-08T22:57:52.047 回答
15

我知道这个线程很旧,并且已经有全面的答案。

以防万一您不知道:

<meta http-equiv="X-UA-Compatible" content="IE=edge" >

您不必将 IE 版本号硬编码为

<meta http-equiv="X-UA-Compatible" content="IE=9" >

于 2015-01-23T09:09:48.167 回答
6

我完全同意所提供的解决方案,但我认为一点澄清很重要,我认为可能是必要的。

对于需要使用提供的值添加 DWORD 的每个进程(另请阅读:vshost.exe、yourWinformApplication.exe.svchost 或 application.exe 的名称),在我的情况下,我在应用程序中保留 9000(十进制)命名和运行顺利且无错误的脚本。

最常见的错误是认为有必要按原样添加“contoso.exe”并认为一切正常!

于 2012-07-12T15:10:52.193 回答
3

是的,WebBrowser 控件使用您安装的任何版本的 IE。这当然意味着,如果您在装有 IE 8 的机器上运行您的应用程序,那么您所依赖的 IE 9 功能将不可用。

于 2011-01-06T06:14:28.740 回答
3

我来到了这个解决方案,但它对我不起作用!因为我使用的是 64 位,所以我不得不更换注册表:

HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Internet Explorer\MAIN\FeatureControl\FEATURE_BROWSER_EMULATION

而不是每个人都在谈论的那个:

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_BROWSER_EMULATION]
于 2013-12-07T17:25:40.963 回答
1

我喜欢下面的 (C#) 代码,它为您的应用程序设置注册表设置。不确定它是否会在安装后切断它,但如果需要权限。对我来说,它解决了 WebSocket 在 WPF 中的 WebBrowser 控件中不可用的问题。

C# webbrowser Ajax 调用

于 2013-12-30T22:20:55.027 回答
1

我遇到了同样的问题,这里的注册表答案不起作用。

我在我的程序的新版本中有一个浏览器控件,在 XP 上运行良好,在 Windows 7(64 位)中失败。旧版本适用于 XP 和 Windows 7。

浏览器中显示的网页使用一些奇怪的插件来显示旧的 SVG 地图(我认为它是一个 Java 小程序)。

原来问题与 Windows 7 中的 DEP 保护有关。

dotnet 2 的旧版本没有在 exe 中设置 DEP required 标志,但从 dotnet 2、SP 1 开始,它确实设置了(是的,exe 的编译行为以及因此的运行时行为会根据您编译的机器而改变,nice . ..)。

它记录在 MSDN 博客NXCOMPAT 和 C# 编译器上。引用:这无疑会让一些开发人员感到惊讶……下载一个框架服务包,重新编译,运行你的应用程序,你现在得到了 IP_ON_HEAP 异常。

在 Visual Studio 的后期构建中添加以下内容,关闭 exe 的 DEP,一切都按预期工作:

all "$(DevEnvDir)..\tools\vsvars32.bat"
editbin.exe /NXCOMPAT:NO "$(TargetPath)"
于 2014-10-21T12:13:11.777 回答
-3

关于白鹰接受的答案。我只是想增加一点动手经验。只是想添加评论,但 SO 抱怨它太长了。

基本上,如果没有安装 IE 9,注册表开关 FEATURE_BROWSER_EMULATION 将根本不起作用。

例如,我今天自己的经验是我试图让 .net webcontrol 在 IE10 模式下工作,因为我试图渲染的一个 html 在 VS2012 下无法与 .netControl 一起工作,甚至在我将 html 加载到 IE8 时也无法工作直接,仍然 css 不能正确渲染(即使我说允许被阻止的内容)。但是我在朋友的win 8机器上用IE10测试了同样的html ok。这就是为什么我试图将 .net webControl 设置为 IE 10 模式但一直失败......

现在我想这是因为我的 win 7 机器只安装了 IE8,所以无论我为 FEATURE_BROWSER_EMULATION 开关设置哪个值(IE9 的值,IE10 IE11 的值),它根本无法工作!

然后我在我的 win 7 机器上下载并安装了 IE 10。仍然无法正常工作,然后我添加了 FEATURE_BROWSER_EMULATION,它开始工作了!

我还注意到,无论我设置了哪个值,甚至默认将其设置为 0,webControl 仍在使用 IE 10 模式,这对我仍然有效。

总而言之,如果您安装了 IE X,但您希望您的 .Net webControl 在 IE (X+N) N>0 modo 下工作,您需要做两件事:

  1. 到 MS 网站下载并在您的机器上安装 IE (X+N),安装后您需要重新启动。

  2. 应用白鹰的答案。

基本上:要使用注册表来控制此功能的值,请将可执行文件的名称添加到以下设置中,并将值设置为与所需设置相匹配。

HKEY_LOCAL_MACHINE (or HKEY_CURRENT_USER)
   SOFTWARE
      Microsoft
         Internet Explorer
            Main
               FeatureControl
                  FEATURE_BROWSER_EMULATION
                     contoso.exe = (DWORD) 00009000

Windows Internet Explorer 8 及更高版本。FEATURE_BROWSER_EMULATION 功能定义了 Internet Explorer 的默认仿真模式并支持以下值。

值 描述

  • 11001 (0x2AF9 Internet Explorer 11。无论 !DOCTYPE 指令如何,网页都以 IE11 边缘模式显示。

    11000 (0x2AF8) IE11。包含基于标准的 !DOCTYPE 指令的网页以 IE11 边缘模式显示。IE11 的默认值。

    10001 (0x2711) Internet Explorer 10。无论 !DOCTYPE 指令如何,网页都以 IE10 标准模式显示。

    10000 (0x02710) Internet Explorer 10。包含基于标准的 !DOCTYPE 指令的网页以 IE10 标准模式显示。Internet Explorer 10 的默认值。

    9999 (0x270F) Windows Internet Explorer 9。无论 !DOCTYPE 指令如何,网页都以 IE9 标准模式显示。

    9000 (0x2328) Internet Explorer 9。包含基于标准的 !DOCTYPE 指令的网页以 IE9 模式显示。Internet Explorer 9 的默认值。

    重要提示 在 Internet Explorer 10 中,包含基于标准的 !DOCTYPE 指令的网页以 IE10 标准模式显示。

    8888 (0x22B8) 网页以 IE8 标准模式显示,无论 !DOCTYPE 指令如何。

    8000 (0x1F40) 包含基于标准的 !DOCTYPE 指令的网页以 IE8 模式显示。Internet Explorer 8 的默认值 重要 在 Internet Explorer 10 中,包含基于标准的 !DOCTYPE 指令的网页以 IE10 标准模式显示。

    7000 (0x1B58) 包含基于标准的 !DOCTYPE 指令的网页以 IE7 标准模式显示。托管 WebBrowser 控件的应用程序的默认值。

完整的参考在这里

于 2014-03-21T23:08:17.010 回答