27

我正在使用自动化(即 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 条目上用浏览器模式与文档模式测试网站

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

MarkSil [MSFT] 回应:

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

托马斯对此回应:

@MarcSil(回复:WebBrowser 控件)

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

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

4

3 回答 3

28

您是否尝试过在您的 html 中设置

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

或者

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

这意味着最新版本

于 2010-11-04T14:39:13.387 回答
13

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。无论 !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:58:21.867 回答
2

FEATURE_BROWSER_EMULATION不适用于CoInternetSetFeatureEnabledINTERNETFEATURELIST的文档自 IE7 以来未更新。

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

于 2010-11-04T21:03:12.160 回答