无法强制WebBrowser Control使用当前版本的IE进行渲染

时间:2014-04-29 05:28:39

标签: c# .net windows winforms internet-explorer

我需要在Windows窗体应用程序中使用WebBrowser控件来使用最新版本的Internet Explorer呈现页面,或至少使用我的计算机上安装的最新版本 - 即IE 11。

几个星期前,在我开始研究这个项目之前,我遇到了一个名为DevDocs.io的网站,在IE 11中它可以运行。但是,即使在应用注册表黑客之后,我也无法在WebBrowser控件中查看DevDocs.io,因为显然我正在使用" Unsupported"浏览器。然后继续说我需要使用Firefox,Chrome或IE 10+。我以为我使用的是IE 10+,因为我已将DWORD添加到注册表中。

由于WebBrowser控件仍然无法在IE11或10中呈现,因此我遇到了许多网站,这些网站由于WebBrowser控件仍无法呈现而无法正常显示或正常运行,或9 ...

我想知道两件事:

  • 是否有公开WebBrowser Control使用的呈现引擎的方法或类?
  • 为什么DWORD注册表无法正常工作,我该如何让它工作?

要说清楚,我已经去了注册表,然后查了一下:HKEY LOCAL MACHINE > SOFTWARE > MICROSOFT > INTERNET EXPLORER > MAIN > FEATURE CONTROL > FEATURE_BROWSER_EMULATION并添加了一个值为myApp.exe11000的DWORD。

根据http://msdn.microsoft.com/en-us/library/ee330730%28VS.85%29.aspx#browser_emulation,11000将使用IE11进行渲染。

2 个答案:

答案 0 :(得分:3)

您需要在主(64位)节点和32位节点HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Internet Explorer\Main\FeatureControl

下添加注册表项

然后,您应该访问http://webdbg.com/ua.aspx以验证文档模式和UA字符串。

答案 1 :(得分:2)

这里我经常使用并适用于我的方法(适用于32位和64位应用程序):

    [STAThread]
    static void Main()
    {
        if (!mutex.WaitOne(TimeSpan.FromSeconds(2), false))
        {
            //another application instance is running
            return;
        }
        try
        {

            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);

            var targetApplication = Process.GetCurrentProcess().ProcessName  + ".exe";
            int ie_emulation = 10000;
            try
            {
                string tmp = Properties.Settings.Default.ie_emulation;
                ie_emulation = int.Parse(tmp);
            }
            catch { }
            SetIEVersioneKeyforWebBrowserControl(targetApplication, ie_emulation);

            m_webLoader = new FormMain();

            Application.Run(m_webLoader);
        }
        finally
        {
            mutex.ReleaseMutex();
        }
    }

    private static void SetIEVersioneKeyforWebBrowserControl(string appName, int ieval)
    {
        RegistryKey Regkey = null;
        try
        {


            Regkey = Microsoft.Win32.Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_BROWSER_EMULATION", true);

            //If the path is not correct or 
            //If user't have priviledges to access registry 
            if (Regkey == null)
            {
                YukLoggerObj.logWarnMsg("Application FEATURE_BROWSER_EMULATION Failed - Registry key Not found");
                return;
            }

            string FindAppkey = Convert.ToString(Regkey.GetValue(appName));

            //Check if key is already present 
            if (FindAppkey == "" + ieval)
            {
                YukLoggerObj.logInfoMsg("Application FEATURE_BROWSER_EMULATION already set to " + ieval);
                Regkey.Close();
                return;
            }

            //If key is not present or different from desired, add/modify the key , key value 
            Regkey.SetValue(appName, unchecked((int)ieval), RegistryValueKind.DWord);

            //check for the key after adding 
            FindAppkey = Convert.ToString(Regkey.GetValue(appName));

            if (FindAppkey == "" + ieval)
                YukLoggerObj.logInfoMsg("Application FEATURE_BROWSER_EMULATION changed to " + ieval + "; changes will be visible at application restart");
            else
                YukLoggerObj.logWarnMsg("Application FEATURE_BROWSER_EMULATION setting failed; current value is  " + ieval);



        }
        catch (Exception ex)
        {
            YukLoggerObj.logWarnMsg("Application FEATURE_BROWSER_EMULATION setting failed; " + ex.Message);

        }
        finally
        {
            //Close the Registry 
            if (Regkey != null)
                Regkey.Close();
        }


    }