怎样把WebBrowser控件放到IE9成标准?

Posted

技术标签:

【中文标题】怎样把WebBrowser控件放到IE9成标准?【英文标题】:How to put the WebBrowser control into IE9 into standards? 【发布时间】:2011-05-05 02:22:12 【问题描述】:

我正在使用自动化(即 COM 自动化)在 Internet Explorer (9) 中显示一些 html

ie = CoInternetExplorer.Create;
ie.Navigate2("about:blank");
webDocument = ie.Document;
webDocument.Write(szSourceHTML);
webDocument.Close();
ie.Visible = True;

Internet Explorer 出现,显示我的 html,开头为:

<!DOCTYPE html>
<HTML>
<HEAD>
   ...

注意: html5 标准模式选择加入文档类型html

除非文档不是ie9标准模式;它处于 ie8 标准模式:


如果我先将 html 保存到我的电脑:

然后查看那个 html文档,IE进入标准模式:

我的问题是如何更新我的SpawnIEWithSource(String html) 函数以使浏览器进入标准模式?

void SpawnIEWithSource(String html)

   Variant ie = CoInternetExplorer.Create();
   ie.Navigate2("about:blank");
   webDocument = ie.Document;
   webDocument.Write(html);
   webDocument.Close();
   ie.Visible = true;


编辑:一个更冗长、更难理解或可读性更强的代码示例,这无助于进一步的问题可能是:

IWebBrowser2 ie;
CoCreateInstance(CLASS_InternetExplorer, null, CLSCTX_INPROC_SERVER | CLSCTX_LOCAL_SERVER, IID_WebBrowser2, ie);
ie.AddRef();
ie.Navigate2("about:blank");

IHtmlDocument doc;
dispDoc = ie.Document;
dispDoc.AddRef();
dispDoc.QueryInterface(IHTMLDocument2, doc);
dispDoc.Release()
doc.Write(html); 
doc.Close();
doc.Release();
ie.Visible = true;
ie.Release();

更新

评论者在 ieblog 条目Testing sites with Browser Mode vs. Doc Mode 上提问:

当 HTML 内容在嵌入的 web 控件中时,我们能否描述如何确定文档模式?似乎是选择了不同的文档模式 - 可能是出于兼容性原因?

MarkSil [MSFT] 回应:

@Thomas:感谢您提出这个问题。 WebBrowser Control 以与 IE 相同的方式确定 doc 模式,因为它包含相同的 Web 平台(例如,IE 和 WebBrowser Control 主机之间有一个共享的 mshtml.dll)。 WebBrowser 控件默认为兼容性视图浏览器模式,这意味着默认的文档模式是 IE7。这是一篇博文,其中包含更多详细信息:blogs.msdn.com/.../more-ie8-extensibility-improvements.aspx。

Thomas 回应:

@MarcSil(回复:WebBrowser 控件)

使用注册表项为 WebControl 选择文档模式的问题在于它适用于整个应用程序。我为 Google SketchUp 编写插件,您可以在其中使用 WebDialog 窗口来创建 UI——它只是一个窗口中的 WebBrowser 控件。但这会导致问题,因为我想为我的 WebBrowser 控件实例强制使用文档模式,而不是对整个 SU 的所有 WebBrowser 控件。

所以,我的问题是:如何控制 WebBrowser 控件的每个实例的文档模式?

【问题讨论】:

不确定您是否检查过我的答案,因为它似乎与您在更新中发布的内容一致.. 没用,直接回复你的回答。 【参考方案1】:

你试过在你的html中设置

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

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

表示最新版本

【讨论】:

返回,抱歉。我尝试添加&lt;META http-equiv="X-UA-Compatible" content="IE=edge" /&gt; 并且文档模式仍然是IE8。 :( 这个答案确实有效,但有一个重要说明:X-UA-Compatible 指令必须放在HEAD 之前所有其他元素(TITLE 或其他META 除外)。所以最简单的方法就是把它放在第一位。例如,如果它被放置在STYLE 之后,那么它将被忽略。 如果我的浏览器是 IE8,是否会在 IE8 中进行边缘渲染? @climboid,是的IE=edge 表示安装的IE浏览器支持的最新版本。如果你的是 IE8,那么它将在 IE8 中呈现。 (keep in mind that this does not work for intranet sites) 这不适用于 WebBrowser 控件。不知道这些家伙在吹什么。这是服务器在 IE11 浏览器上使用该元数据的页面上看到的内容,使用 Request.BrowserType = InternetExplorer11 Name = InternetExplorer Version = 11.0 Major Version = 11 Minor Version = 0 这是我从同一页面中的 WebControl 获得的内容,来自同一台机器:Type = IE7 Name = IE Version = 7.0 Major Version = 7 Minor Version = 0【参考方案2】:

FEATURE_BROWSER_EMULATION 不适用于CoInternetSetFeatureEnabled。 INTERNETFEATURELIST的文档自IE7以来没有更新。

由于功能设置位于 HKEY_CURRENT_USER\SOFTWARE\Microsoft\Internet Explorer\Main\FeatureControl 下,您可能能够通过注册表 API 挂钩覆盖进程中的值。

【讨论】:

我还没来得及测试你的想法。但是因为我从来不知道有 GetOverrideKeyPath 这样的功能所以点赞。【参考方案3】:

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

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

这是完整的代码集:

9999 (0x270F) - Internet Explorer 9。 网页在IE9中显示 标准模式,无论 !DOCTYPE 指令。 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

【讨论】:

就我所知。但是问题来了,如果我将值设置为 9999 但客户端是 IE8(即在 IE 最大版本为 8 的 XP 上)怎么办?它是强制 IE8 标准模式还是什么都不强制?

以上是关于怎样把WebBrowser控件放到IE9成标准?的主要内容,如果未能解决你的问题,请参考以下文章

使用 IE9 的 WebBrowser 控件

WebBrowser控件默认使用IE9,IE10的方法

安装 IE9 后使用 WebBrowser 控件的应用程序崩溃

WebBrowser(超文本浏览框)控件默认使用IE9,IE10的方法

VB使用webbrowser控件时怎样释放内存?我使用了许多webbrowser数组时,只见占用内存越来越大。最后崩溃

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