如何将WebBrowser控件放入IE9标准?

Ian*_*oyd 27 com standards html5 automation internet-explorer-9

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

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

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

<!DOCTYPE html>
<HTML>
<HEAD>
   ...
Run Code Online (Sandbox Code Playgroud)

注意: html5标准模式选择加入doctypehtml

除非文件不符合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;
}
Run Code Online (Sandbox Code Playgroud)

编辑:一个更详细,更不易理解或可读的代码示例,这无助于进一步提出问题可能是:

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();
Run Code Online (Sandbox Code Playgroud)

更新

评论者在ieblog条目中询问使用浏览器模式与文档模式的测试站点:

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

MarkSil [MSFT]回复:

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

托马斯回应:

@MarcSil(re:WebBrowser Control)

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

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

Gab*_*oli 28

你试过设置你的HTML吗?

<meta http-equiv="X-UA-Compatible" content="IE=9" />
Run Code Online (Sandbox Code Playgroud)

要么

<meta http-equiv="X-UA-Compatible" content="IE=edge" />
Run Code Online (Sandbox Code Playgroud)

这意味着最新版本

  • 这个答案**确实有效,但有一个重要的注意事项:`X-UA-Compatible`指令必须放在`HEAD`*之前*所有其他元素(除了`TITLE`或其他`META`).所以最简单的方法就是放在第一位.如果它被放置,例如,在'STYLE`之后,那么它将被忽略. (11认同)

whi*_*awk 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
Run Code Online (Sandbox Code Playgroud)

这是完整的代码集:

  • 9999(0x270F) - Internet Explorer 9.无论使用何种!DOCTYPE指令,网页都以IE9标准模式显示.
  • 9000(0x2328) - Internet Explorer 9.包含基于标准的网页!DOCTYPE指令以IE9模式显示.
  • 8888(0x22B8) -无论!DOCTYPE指令如何,网页都以IE8标准模式显示.
  • 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标准模式还是什么都没有? (2认同)