怎样把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" />
表示最新版本
【讨论】:
返回,抱歉。我尝试添加<META http-equiv="X-UA-Compatible" content="IE=edge" />
并且文档模式仍然是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.Browser
:Type = 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的方法
VB使用webbrowser控件时怎样释放内存?我使用了许多webbrowser数组时,只见占用内存越来越大。最后崩溃
delphi webbrowser,如何调整webbrowser里面打开网页的大小,或者使打开的内容适应webbrowser控件的大小。