【问题标题】:MSIEs WebBrowser control hosted in winforms app runs in compatibility mode托管在 winforms 应用程序中的 MSIE WebBrowser 控件以兼容模式运行
【发布时间】:2011-04-03 00:43:29
【问题描述】:

我以 winforms 形式托管 MSIE。不幸的是,无论我是否给它一个在独立 IE 中以 IE8 模式运行的页面,它都坚持在兼容模式下运行。这样做的结果是,在独立 MSIE 中正确呈现的某些内容在托管控件中完全错位并弄乱了。

除了文档类型等之外,是否有一些神奇的方法可以告诉网络浏览器我希望它以与在独立 MSIE 中加载页面相同的方式呈现页面?

我不想使用注册表项覆盖 (http://blogs.msdn.com/b/ie/archive/2009/03/10/more-ie8-extensibility-improvements.aspx),因为我的表单是另一个应用程序加载项的一部分。我不想更改主应用程序的 IE 行为,也不想更改在该应用程序下运行的其他加载项。我只希望它在以 my 形式托管的浏览器中工作,而不是应用范围和进程范围。

【问题讨论】:

    标签: winforms internet-explorer internet-explorer-8 webbrowser-control ie8-compatibility-mode


    【解决方案1】:

    我还没有对此进行测试,但是如何使用META 标记以及HTTP-EQUIV 属性将X-UA-COMPATIBLE 值设置为IE=8,这会指示Web 浏览器在IE 中显示页面8个标准模式。一个例子是:

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

    从下面article 中的这一行看来,这应该可行。

    默认情况下,托管 WebBrowser 控件打开 IE7 模式下基于标准的页面 除非页面包含 适当的 X-UA-Compatible 标头。 您可以通过添加名称来更改它 应用程序可执行文件的 FEATURE_BROWSER_EMULATION 功能 控制键和设置值 相应地。

    【讨论】:

    • 谢谢。我添加了 X-UA-Compatible 元标记。仍在尝试确认它是否有效......
    • 使用元标记的结果是什么?我能够对其进行测试并且它有效。
    • 到目前为止,我对元标记的测试结果尚无定论。不确定,因为在应用标记后它被正确呈现,但是在将元标记更改为 IE7 后它仍然正确呈现,并且在再次删除它之后它仍然正确呈现。换句话说,在第一轮测试之后,我无法重现我在使用元标记之前看到的渲染错误。我需要做更多测试,但还没有时间...
    • 我也尝试使用X-UA-Compatible (stackoverflow.com/questions/4097593/…)。它对我也不起作用。
    • @Ian Boyd - 确保 X-UA 兼容的东西是 标记内的 first 标记...如果不是,IE 会忽略它。跨度>
    【解决方案2】:

    要更改应用程序中运行的 Web 浏览器控件的默认行为以匹配 IE 本身的行为,您必须设置 FEATURE_BROWSER_EMULATION 功能控制键。

    例如,您可以模仿 IE8 的行为(允许网站以 IE8 标准模式呈现),如下所示。

    内部 HKEY_LOCAL_MACHINE\Software\Microsoft\Internet Explorer\Main\FeatureControl

    创建一个名为 FEATURE_BROWSER_EMULATION

    的新密钥

    在该键中,添加一个新的 REG_DWORD,其值为 8000,并带有应用程序可执行文件的名称。例如:

    "YourApp.exe" = dword 8000 (Hex: 0x1F40)
    

    更多详情请见: http://blogs.msdn.com/b/ie/archive/2009/03/10/more-ie8-extensibility-improvements.aspx

    【讨论】:

    • 问题是我的应用实际上是在另一个应用中运行的加载项。主应用程序也托管 MSIE,其他加载项也是如此。通过添加功能控制注册表项,我将更改整个应用程序的行为并引入不需要的行为/渲染。我只想将它更改为我托管 MSIE 的一种形式,同时保持所有其他浏览器在同一主可执行文件下运行。
    • 很遗憾,这不是受支持的方案。
    • 好的,谢谢。 IE 的未来版本怎么样,当托管在另一个进程中时,它们是否也会像早期版本一样运行?我必须说我觉得奇怪的是 IE8 在默认情况下不像 IE8,然后为那些希望它像 IE7/6/5/etc 一样的人使用注册表。
    • IE9 的行为与 IE8 相同,需要选择加入。这里的要点是,在托管时模拟旧版本是它允许用户无畏地安装新版本的 IE,而不会破坏他们的其他应用程序。
    • 如果他们更新CoInternetSetFeatureEnabled API 以添加此功能会很好,这将允许我们完全避免注册表,但我注意到urlmon.h 不包含此枚举。我猜是一厢情愿的想法。
    猜你喜欢
    • 2011-01-23
    • 1970-01-01
    • 1970-01-01
    • 2023-03-18
    • 1970-01-01
    • 1970-01-01
    • 2014-09-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多