Use latest version of Internet Explorer in the webbrowser control

后端 未结 13 1401
长发绾君心
长发绾君心 2020-11-21 23:29

The default version of the webbrowser control in a C# Windows Forms application is 7. I have changed to 9 by the article Browser Emulation, but how is it possible t

13条回答
  •  执念已碎
    2020-11-22 00:17

    I saw Veer's answer. I think it's right, but it did not I work for me. Maybe I am using .NET 4 and am using 64x OS so kindly check this.

    You may put in setup or check it in start-up of your application:

    private void Form1_Load(object sender, EventArgs e)
    {
        var appName = Process.GetCurrentProcess().ProcessName + ".exe";
        SetIE8KeyforWebBrowserControl(appName);
    }
    
    private void SetIE8KeyforWebBrowserControl(string appName)
    {
        RegistryKey Regkey = null;
        try
        {
            // For 64 bit machine
            if (Environment.Is64BitOperatingSystem)
                Regkey = Microsoft.Win32.Registry.LocalMachine.OpenSubKey(@"SOFTWARE\\Wow6432Node\\Microsoft\\Internet Explorer\\Main\\FeatureControl\\FEATURE_BROWSER_EMULATION", true);
            else  //For 32 bit machine
                Regkey = Microsoft.Win32.Registry.LocalMachine.OpenSubKey(@"SOFTWARE\\Microsoft\\Internet Explorer\\Main\\FeatureControl\\FEATURE_BROWSER_EMULATION", true);
    
            // If the path is not correct or
            // if the user haven't priviledges to access the registry
            if (Regkey == null)
            {
                MessageBox.Show("Application Settings Failed - Address Not found");
                return;
            }
    
            string FindAppkey = Convert.ToString(Regkey.GetValue(appName));
    
            // Check if key is already present
            if (FindAppkey == "8000")
            {
                MessageBox.Show("Required Application Settings Present");
                Regkey.Close();
                return;
            }
    
            // If a key is not present add the key, Key value 8000 (decimal)
            if (string.IsNullOrEmpty(FindAppkey))
                Regkey.SetValue(appName, unchecked((int)0x1F40), RegistryValueKind.DWord);
    
            // Check for the key after adding
            FindAppkey = Convert.ToString(Regkey.GetValue(appName));
    
            if (FindAppkey == "8000")
                MessageBox.Show("Application Settings Applied Successfully");
            else
                MessageBox.Show("Application Settings Failed, Ref: " + FindAppkey);
        }
        catch (Exception ex)
        {
            MessageBox.Show("Application Settings Failed");
            MessageBox.Show(ex.Message);
        }
        finally
        {
            // Close the Registry
            if (Regkey != null)
                Regkey.Close();
        }
    }
    

    You may find messagebox.show, just for testing.

    Keys are as the following:

    • 11001 (0x2AF9) - Internet Explorer 11. Webpages are displayed in IE11 edge mode, regardless of the !DOCTYPE directive.

    • 11000 (0x2AF8) - Internet Explorer 11. Webpages containing standards-based !DOCTYPE directives are displayed in IE11 edge mode. Default value for IE11.

    • 10001 (0x2711)- Internet Explorer 10. Webpages are displayed in IE10 Standards mode, regardless of the !DOCTYPE directive.

    • 10000 (0x2710)- Internet Explorer 10. Webpages containing standards-based !DOCTYPE directives are displayed in IE10 Standards mode. Default value for Internet Explorer 10.

    • 9999 (0x270F) - Internet Explorer 9. Webpages are displayed in IE9 Standards mode, regardless of the !DOCTYPE directive.

    • 9000 (0x2328) - Internet Explorer 9. Webpages containing standards-based !DOCTYPE directives are displayed in IE9 mode.

    • 8888 (0x22B8) - Webpages are displayed in IE8 Standards mode, regardless of the !DOCTYPE directive.

    • 8000 (0x1F40) - Webpages containing standards-based !DOCTYPE directives are displayed in IE8 mode.

    • 7000 (0x1B58) - Webpages containing standards-based !DOCTYPE directives are displayed in IE7 Standards mode.

    Reference: MSDN: Internet Feature Controls

    I saw applications like Skype use 10001. I do not know.

    NOTE

    The setup application will change the registry. You may need to add a line in the Manifest File to avoid errors due to permissions of change in registry:

    
    

    UPDATE 1

    This is a class will get the latest version of IE on windows and make changes as should be;

    public class WebBrowserHelper
    {
    
    
        public static int GetEmbVersion()
        {
            int ieVer = GetBrowserVersion();
    
            if (ieVer > 9)
                return ieVer * 1000 + 1;
    
            if (ieVer > 7)
                return ieVer * 1111;
    
            return 7000;
        } // End Function GetEmbVersion
    
        public static void FixBrowserVersion()
        {
            string appName = System.IO.Path.GetFileNameWithoutExtension(System.Reflection.Assembly.GetExecutingAssembly().Location);
            FixBrowserVersion(appName);
        }
    
        public static void FixBrowserVersion(string appName)
        {
            FixBrowserVersion(appName, GetEmbVersion());
        } // End Sub FixBrowserVersion
    
        // FixBrowserVersion("", 9000);
        public static void FixBrowserVersion(string appName, int ieVer)
        {
            FixBrowserVersion_Internal("HKEY_LOCAL_MACHINE", appName + ".exe", ieVer);
            FixBrowserVersion_Internal("HKEY_CURRENT_USER", appName + ".exe", ieVer);
            FixBrowserVersion_Internal("HKEY_LOCAL_MACHINE", appName + ".vshost.exe", ieVer);
            FixBrowserVersion_Internal("HKEY_CURRENT_USER", appName + ".vshost.exe", ieVer);
        } // End Sub FixBrowserVersion 
    
        private static void FixBrowserVersion_Internal(string root, string appName, int ieVer)
        {
            try
            {
                //For 64 bit Machine 
                if (Environment.Is64BitOperatingSystem)
                    Microsoft.Win32.Registry.SetValue(root + @"\Software\Wow6432Node\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_BROWSER_EMULATION", appName, ieVer);
                else  //For 32 bit Machine 
                    Microsoft.Win32.Registry.SetValue(root + @"\Software\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_BROWSER_EMULATION", appName, ieVer);
    
    
            }
            catch (Exception)
            {
                // some config will hit access rights exceptions
                // this is why we try with both LOCAL_MACHINE and CURRENT_USER
            }
        } // End Sub FixBrowserVersion_Internal 
    
        public static int GetBrowserVersion()
        {
            // string strKeyPath = @"HKLM\SOFTWARE\Microsoft\Internet Explorer";
            string strKeyPath = @"HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Internet Explorer";
            string[] ls = new string[] { "svcVersion", "svcUpdateVersion", "Version", "W2kVersion" };
    
            int maxVer = 0;
            for (int i = 0; i < ls.Length; ++i)
            {
                object objVal = Microsoft.Win32.Registry.GetValue(strKeyPath, ls[i], "0");
                string strVal = System.Convert.ToString(objVal);
                if (strVal != null)
                {
                    int iPos = strVal.IndexOf('.');
                    if (iPos > 0)
                        strVal = strVal.Substring(0, iPos);
    
                    int res = 0;
                    if (int.TryParse(strVal, out res))
                        maxVer = Math.Max(maxVer, res);
                } // End if (strVal != null)
    
            } // Next i
    
            return maxVer;
        } // End Function GetBrowserVersion 
    
    
    }
    

    using of class as followed

    WebBrowserHelper.FixBrowserVersion();
    WebBrowserHelper.FixBrowserVersion("SomeAppName");
    WebBrowserHelper.FixBrowserVersion("SomeAppName",intIeVer);
    

    you may face a problem for in comparability of windows 10, may due to your website itself you may need to add this meta tag

    
    

    Enjoy :)

提交回复
热议问题