如何在 WinForms 应用程序中关闭 IE WebBrowserControl 上的兼容性视图?

Posted

技术标签:

【中文标题】如何在 WinForms 应用程序中关闭 IE WebBrowserControl 上的兼容性视图?【英文标题】:How do I turn off Compatibility View on the IE WebBrowserControl in a WinForms app? 【发布时间】:2011-10-06 17:16:28 【问题描述】:

在我的 WinForms 应用程序中,如果我使用 WebBrowser 控件,它似乎被强制进入兼容模式。如何禁用此功能,并使其在浏览同一站点时与我的机器上的独立 IE 行为相同?

我不想更改注册表。我希望所有内容都包含在我的应用中。 我正在加载的网站不是我的,因此我无法对其进行更改(除非可以在我的应用程序中以编程方式完成)。

【问题讨论】:

另见 (***.com/questions/4097593/…) 【参考方案1】:

这是问题的关键:如果用户在 IE8 中启用兼容性视图,那么它将覆盖所有页面指令。因此,如果用户在 IE 中打开了此功能,您尝试使用的任何页面或服务器变量都将无法阻止 IE 切换到兼容性视图。大多数人认为页面指令或某种秘密标头服务器变量将修复站点。没有。如果设置已被手动覆盖,这些解决方案都不起作用。我知道,这并不酷。因此,仅当用户没有启用兼容性视图功能时,以下操作才有效。

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

要阐明在注册表中更改此项的步骤,请编辑键:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Internet Explorer\MAIN\FeatureControl\FEATURE_BROWSER_EMULATION

然后添加一个名为 iexplore.exe 的新 DWORD。为此,请右键单击该键并选择新建 > DWORD。为该 DWORD 指定十进制值 9999。这将使所有站点在没有兼容性视图的情况下呈现。要再次启用兼容性视图,请删除此 DWORD。此外,如果您希望自动执行此更改并在您的系统上运行批处理脚本,请查看 Michal M 的脚本。

https://gist.github.com/michal-m/1853315

【讨论】:

【参考方案2】:

我知道这是一个老问题,但有一种方法可以在 Visual Basic 2010 及更高版本的 webbrowser 控件中插入标题以禁用兼容性视图:

你需要做的第一件事是捕捉当前网页,然后替换head标签如下:

Sub compatible()
' --- simple routine to disable compatible view.

    Dim the_url As String
    Dim message As String
    Dim theReplacement As String
    Dim oldMessage As String

    the_url = WebBrowser1.Url.OriginalString

    WebBrowser1.Navigate(the_url)

    message = "<head>" + Chr(13) + Chr(10) + "<meta http-equiv=" + Chr(34) + "X-UA-Compatible" + Chr(34) + "content=" + Chr(34) + "IE=edge" + Chr(34) + " />" + Chr(13) + Chr(10) + "<base href=" + Chr(34) + the_url + Chr(34) + ">"

    oldMessage = WebBrowser1.DocumentText.ToString()

    theReplacement = Replace(oldMessage, "<head>", message)
    WebBrowser1.DocumentText = theReplacement

End Sub

此代码在 webbrowser 控件中添加以下两行:

<meta http-equiv="X-UA-Compatible"content="IE=edge" />
<base href="(url of the web page)">

【讨论】:

这应该可以;虽然这可能有点冒险(可能导致重复请求到服务器进行 ajax 等)。您可能需要针对您希望在控件中拥有的特定站点对其进行很好的测试。【参考方案3】:

虽然这不是您所要求的,但如果您拥有该网站,您可以将以下内容添加到 html 的 head 部分。:

&lt;meta http-equiv="X-UA-Compatible" content="IE=EmulateIE9" /&gt;

见: http://msdn.microsoft.com/en-us/library/cc288325(v=vs.85).aspx

【讨论】:

我无法控制网站 :( 请记住,如果用户手动设置了兼容性视图,此页面指令将失败。 当由于某种原因注册表编辑似乎不起作用时,这篇文章确实帮助了我。谢谢! 注意这必须是head部分的first标签。【参考方案4】:

除了配置以下注册表设置之外,没有其他方法:

HKLM\Software\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_BROWSER_EMULATION

或者如果它是 64 位 Windows 上的 32 位应用程序:

HKLM\SOFTWARE\Wow6432Node\Microsoft\Internet Explorer\MAIN\FeatureControl\FEATURE_BROWSER_EMULATION`

这些设置不会出现在WebBrowser 控件中。

更多信息请见:

What IE compatibility mode does the webbrowser control use?

万一链接失效:

您创建一个与可执行文件名称匹配的DWORD 值,并将此值设置为以下之一:

7000:包含基于标准的&lt;!DOCTYPE&gt; 指令的页面以 IE7 模式显示。 8000:包含基于标准的 &lt;!DOCTYPE&gt; 指令的页面以 IE8 模式显示 8888:无论&lt;!DOCTYPE&gt; 指令如何,页面始终以 IE8 模式显示。 (这绕过了前面列出的例外情况。) 9000:使用 IE9 设置! 9999:强制 IE9

例如:

来自我自己对 IE9 的实验:

9000 - 继承在 IE9 的全局兼容模式设置中设置的兼容模式。 IE。:

9999 - 强制 IE9 在主机应用程序中退出兼容模式,而不管全局配置的兼容模式设置如何

您的应用程序可能需要检测可用于确定使用哪个值的底层 IE 版本:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Internet Explorer\版本

或者如果它是 64 位 Windows 上的 32 位应用程序:

HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Internet Explorer\Version

还有一篇IE8出来时的老文章值得一看:

More IE8 Extensibility Improvements

您还可以在以下位置为每个用户配置这些设置:

HKCU\Software\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_BROWSER_EMULATION

【讨论】:

不幸的是,事情就是这样。 我真的不明白为什么控件的行为与浏览器不同 - 似乎完全不直观:(我正在考虑自己发送 WebRequest 并将结果解析到我自己的 UI 中。我在尝试避免它,但这可能是最简单的解决方案! 我很确定 FEATURE_NATIVE_DOCUMENT_MODE 在最​​初的 IE8 测试版之一之外不受支持,并且在 IE8 的最终版本中也不支持。 FEATURE_BROWSER_EMULATION 是您想要使用的。 另外,对于 IE10 使用值 10001 IE11的十进制值就是:11000。

以上是关于如何在 WinForms 应用程序中关闭 IE WebBrowserControl 上的兼容性视图?的主要内容,如果未能解决你的问题,请参考以下文章

我如何只能在任何现代浏览器(如 chrome、firefox、safari、opera、IE 以及任何版本的通用 javascript [重复])中关闭当前选项卡

如何在'rake test'中关闭警告'ruby -w'?

位置:修复在 Chrome 和 IE 中关闭画布菜单时效果不佳的问题

如何避免在引导程序中关闭模式

如何在qml中关闭工作表?

如何在 Kivy 中关闭全屏?