首页 文章

在Web浏览器控件中使用最新版本的Internet Explorer

提问于
浏览
69

C#Windows Forms应用程序中的Web浏览器控件的默认版本是7.我已经通过文章Browser Emulation将其更改为9,但是如何在Web浏览器控件中使用已安装的Internet Explorer的最新版本?

13 回答

  • 1

    我看到了Veer的回答 . 我认为这是对的,但我没有为我工作 . 也许我正在使用.NET 4并使用64x操作系统,请仔细检查 .

    您可以在启动应用程序时进行设置或检查:

    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();
        }
    }
    

    您可以找到messagebox.show,仅用于测试 .

    Keys are as the following:

    11001(0x2AF9) - Internet Explorer 11.无论!DOCTYPE指令如何,网页都以IE11边缘模式显示 . 11000(0x2AF8) - Internet Explorer 11.包含基于标准的网页!DOCTYPE指令以IE11边缘模式显示 . IE11的默认值 . 10001(0x2711) - Internet Explorer 10.网页以IE10标准模式显示,与!DOCTYPE指令无关 . 10000(0x2710) - Internet Explorer 10.包含基于标准的网页!DOCTYPE指令以IE10标准模式显示 . Internet Explorer 10的默认值.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标准模式显示 .

    参考:MSDN: Internet Feature Controls

    我看到像Skype这样的应用程序使用10001.我不知道 .

    NOTE

    安装应用程序将更改注册表 . 您可能需要在清单文件中添加一行以避免由于注册表更改权限而导致的错误:

    <requestedExecutionLevel level="highestAvailable" uiAccess="false" />
    

    UPDATE 1

    这是一个类将在Windows上获取最新版本的IE并进行更改;

    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("<YourAppName>", 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 
    
    
    }
    

    使用类如下

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

    您可能在Windows 10的可比性方面遇到问题,可能由于您的网站本身,您可能需要添加此元标记

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

    请享用 :)

  • 13

    使用MSDN中的值:

    int BrowserVer, RegVal;
    
      // get the installed IE version
      using (WebBrowser Wb = new WebBrowser())
        BrowserVer = Wb.Version.Major;
    
      // set the appropriate IE version
      if (BrowserVer >= 11)
        RegVal = 11001;
      else if (BrowserVer == 10)
        RegVal = 10001;
      else if (BrowserVer == 9)
        RegVal = 9999;
      else if (BrowserVer == 8)
        RegVal = 8888;
      else
        RegVal = 7000;
    
      // set the actual key
      using (RegistryKey Key = Registry.CurrentUser.CreateSubKey(@"SOFTWARE\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_BROWSER_EMULATION", RegistryKeyPermissionCheck.ReadWriteSubTree))
        if (Key.GetValue(System.Diagnostics.Process.GetCurrentProcess().ProcessName + ".exe") == null)
          Key.SetValue(System.Diagnostics.Process.GetCurrentProcess().ProcessName + ".exe", RegVal, RegistryValueKind.DWord);
    
  • 76
    var appName = System.Diagnostics.Process.GetCurrentProcess().ProcessName + ".exe";
    
    using (var Key = Registry.CurrentUser.OpenSubKey(@"SOFTWARE\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_BROWSER_EMULATION", true))
        Key.SetValue(appName, 99999, RegistryValueKind.DWord);
    

    根据我在这里读到的内容(Controlling WebBrowser Control Compatibility

    如果我将FEATURE_BROWSER_EMULATION文档模式值设置为高于客户端上的IE版本,会发生什么?显然,浏览器控件只能支持小于或等于客户端上安装的IE版本的文档模式 . 使用FEATURE_BROWSER_EMULATION键最适用于有部署和支持版本的浏览器的企业级业务应用程序 . 如果您将值设置为比客户端上安装的浏览器版本更高的浏览器模式,则浏览器控件将选择可用的最高文档模式 .

    最简单的方法是输入一个非常高的十进制数......

  • 50

    你可以试试这个link

    try
    {
        var IEVAlue =  9000; // can be: 9999 , 9000, 8888, 8000, 7000
        var targetApplication = Processes.getCurrentProcessName() + ".exe"; 
        var localMachine = Registry.LocalMachine;
        var parentKeyLocation = @"SOFTWARE\Microsoft\Internet Explorer\MAIN\FeatureControl";
        var keyName = "FEATURE_BROWSER_EMULATION";
        "opening up Key: {0} at {1}".info(keyName, parentKeyLocation);
        var subKey = localMachine.getOrCreateSubKey(parentKeyLocation,keyName,true);
        subKey.SetValue(targetApplication, IEVAlue,RegistryValueKind.DWord);
        return "all done, now try it on a new process".info();
    }
    catch(Exception ex)
    {
        ex.log();
        "NOTE: you need to run this under no UAC".info();
    }
    
  • 11

    我没有更改RegKey,而是在HTML的 Headers 中加了一行:

    <html>
        <head>
            <!-- Use lastest version of Internet Explorer -->
            <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    
            <!-- Insert other header tags here -->
        </head>
        ...
    </html>
    

    Web Browser Control & Specifying the IE Version .

  • 0

    这里我通常使用的方法适用于我(适用于32位和64位应用程序; ie_emulation可以是此处记录的任何人:Internet Feature Controls (B..C), Browser Emulation):

    [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 haven't privileges to access the 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 a 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();
            }
        }
    
  • 2

    我能够实现Luca的解决方案,但我必须做一些改变才能工作 . 我的目标是将D3.js与Web浏览器控件一起用于Windows窗体应用程序(面向.NET 2.0) . 它现在对我有用 . 我希望这可以帮助别人 .

    using System;
    using System.Collections.Generic;
    using System.Windows.Forms;
    using System.Threading;
    using Microsoft.Win32;
    using System.Diagnostics;
    
    namespace ClientUI
    {
        static class Program
        {
            static Mutex mutex = new System.Threading.Mutex(false, "jMutex");
    
            /// <summary>
            /// The main entry point for the application.
            /// </summary>
            [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 = 11999;
                    try
                    {
                        string tmp = Properties.Settings.Default.ie_emulation;
                        ie_emulation = int.Parse(tmp);
                    }
                    catch { }
                    SetIEVersioneKeyforWebBrowserControl(targetApplication, ie_emulation);
    
                    Application.Run(new MainForm());
                }
                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 doesn't have privileges to access the registry
                    if (Regkey == null)
                    {
                        MessageBox.Show("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.ToString())
                    {
                        MessageBox.Show("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.ToString())
                    {
                        MessageBox.Show("Application FEATURE_BROWSER_EMULATION changed to " + ieval + "; changes will be visible at application restart");
                    }
                    else
                    {
                        MessageBox.Show("Application FEATURE_BROWSER_EMULATION setting failed; current value is  " + ieval);
                    }
                }
                catch (Exception ex)
                {
                    MessageBox.Show("Application FEATURE_BROWSER_EMULATION setting failed; " + ex.Message);
                }
                finally
                {
                    //Close the Registry
                    if (Regkey != null) Regkey.Close();
                }
            }
        }
    }
    

    另外,我在项目的设置中添加了一个字符串(ie_emulation),值为11999.这个值似乎适用于IE11(11.0.15) .

    接下来,我必须更改我的应用程序的权限,以允许访问注册表 . 这可以通过向项目添加新项目来完成(使用VS2012) . 在“常规项”下,选择“应用程序清单文件” . 将级别从asInvoker更改为requireAdministrator(如下所示) .

    <requestedExecutionLevel level="requireAdministrator" uiAccess="false" />
    

    如果有人正在尝试将D3.js与webbrowser控件一起使用,则可能必须修改要存储在HTML页面内的变量中的JSON数据,因为D3.json使用XmlHttpRequest(更容易与Web服务器一起使用) . 完成上述更改后,我的Windows窗体能够加载调用D3的本地HTML文件 .

  • 0

    使用:

    // Get the installed Internet Explorer version
    using (WebBrowser Wb = new WebBrowser())
        BrowserVer = Wb.Version.Major;
    
    // Set the appropriate Internet Explorer version
    if (BrowserVer >= 11)
        RegVal = 11001;
    else if (BrowserVer == 10)
        RegVal = 10001;
    else if (BrowserVer == 9)
        RegVal = 9999;
    else if (BrowserVer == 8)
        RegVal = 8888;
    else
        RegVal = 7000;
    
    // Set the actual key
    RegistryKey Key = Registry.CurrentUser.OpenSubKey(@"SOFTWARE\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_BROWSER_EMULATION", true);
    Key.SetValue(System.Diagnostics.Process.GetCurrentProcess().ProcessName + ".exe", RegVal, RegistryValueKind.DWord);
    Key.Close();
    
  • 10

    结合RooiWillie和MohD的答案
    并记得以管理权限运行您的应用程序 .

    var appName = System.Diagnostics.Process.GetCurrentProcess().ProcessName + ".exe";
    
    RegistryKey Regkey = null;
    try
    {
        int BrowserVer, RegVal;
    
        // get the installed IE version
        using (WebBrowser Wb = new WebBrowser())
            BrowserVer = Wb.Version.Major;
    
        // set the appropriate IE version
        if (BrowserVer >= 11)
            RegVal = 11001;
        else if (BrowserVer == 10)
            RegVal = 10001;
        else if (BrowserVer == 9)
            RegVal = 9999;
        else if (BrowserVer == 8)
            RegVal = 8888;
        else
            RegVal = 7000;
    
        //For 64 bit Machine 
        if (Environment.Is64BitOperatingSystem)
            Regkey = Microsoft.Win32.Registry.CurrentUser.OpenSubKey(@"SOFTWARE\\Wow6432Node\\Microsoft\\Internet Explorer\\MAIN\\FeatureControl\\FEATURE_BROWSER_EMULATION", true);
        else  //For 32 bit Machine 
            Regkey = Microsoft.Win32.Registry.CurrentUser.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)
        {
            MessageBox.Show("Registry Key for setting IE WebBrowser Rendering Address Not found. Try run the program with administrator's right.");
            return;
        }
    
        string FindAppkey = Convert.ToString(Regkey.GetValue(appName));
    
        //Check if key is already present 
        if (FindAppkey == RegVal.ToString())
        {
            Regkey.Close();
            return;
        }
    
        Regkey.SetValue(appName, RegVal, RegistryValueKind.DWord);
    }
    catch (Exception ex)
    {
        MessageBox.Show("Registry Key for setting IE WebBrowser Rendering failed to setup");
        MessageBox.Show(ex.Message);
    }
    finally
    {
        //Close the Registry 
        if (Regkey != null)
            Regkey.Close();
    }
    
  • 4

    只需将以下内容添加到您的html中就可以了解注册表设置

    <meta http-equiv="X-UA-Compatible" content="IE=11" >
    
  • 4

    Visual Basic版本:

    Private Sub setRegisterForWebBrowser()
    
        Dim appName = Process.GetCurrentProcess().ProcessName + ".exe"
        SetIE8KeyforWebBrowserControl(appName)
    End Sub
    
    Private Sub SetIE8KeyforWebBrowserControl(appName As String)
        'ref:    http://stackoverflow.com/questions/17922308/use-latest-version-of-ie-in-webbrowser-control
        Dim Regkey As RegistryKey = Nothing
        Dim lgValue As Long = 8000
        Dim strValue As Long = lgValue.ToString()
    
        Try
    
            'For 64 bit Machine 
            If (Environment.Is64BitOperatingSystem) Then
                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)
            End If
    
    
            'If the path Is Not correct Or 
            'If user't have priviledges to access registry 
            If (Regkey Is Nothing) Then
    
                MessageBox.Show("Application Settings Failed - Address Not found")
                Return
            End If
    
    
            Dim FindAppkey As String = Convert.ToString(Regkey.GetValue(appName))
    
            'Check if key Is already present 
            If (FindAppkey = strValue) Then
    
                MessageBox.Show("Required Application Settings Present")
                Regkey.Close()
                Return
            End If
    
    
            'If key Is Not present add the key , Kev value 8000-Decimal 
            If (String.IsNullOrEmpty(FindAppkey)) Then
                ' Regkey.SetValue(appName, BitConverter.GetBytes(&H1F40), RegistryValueKind.DWord)
                Regkey.SetValue(appName, lgValue, RegistryValueKind.DWord)
    
                'check for the key after adding 
                FindAppkey = Convert.ToString(Regkey.GetValue(appName))
            End If
    
            If (FindAppkey = strValue) Then
                MessageBox.Show("Registre de l'application appliquée avec succès")
            Else
                MessageBox.Show("Échec du paramètrage du registre, Ref: " + FindAppkey)
            End If
        Catch ex As Exception
    
    
            MessageBox.Show("Application Settings Failed")
            MessageBox.Show(ex.Message)
    
        Finally
    
            'Close the Registry 
            If (Not Regkey Is Nothing) Then
                Regkey.Close()
            End If
        End Try
    End Sub
    
  • 3

    我知道这已发布,但这里是我使用的dotnet 4.5的当前版本 . 我建议使用默认的浏览器仿真方面DOCTYPE

    InternetExplorerFeatureControl.Instance.BrowserEmulation = DocumentMode.DefaultRespectDocType;

    internal class InternetExplorerFeatureControl
    {
        private static readonly Lazy<InternetExplorerFeatureControl> LazyInstance = new Lazy<InternetExplorerFeatureControl>(() => new InternetExplorerFeatureControl());
        private const string RegistryLocation = @"SOFTWARE\Microsoft\Internet Explorer\Main\FeatureControl";
        private readonly RegistryView _registryView = Environment.Is64BitOperatingSystem && Environment.Is64BitProcess ? RegistryView.Registry64 : RegistryView.Registry32;
        private readonly string _processName;
        private readonly Version _version;
    
        #region Feature Control Strings (A)
    
        private const string FeatureRestrictAboutProtocolIe7 = @"FEATURE_RESTRICT_ABOUT_PROTOCOL_IE7";
        private const string FeatureRestrictAboutProtocol = @"FEATURE_RESTRICT_ABOUT_PROTOCOL";
    
        #endregion
    
        #region Feature Control Strings (B)
    
        private const string FeatureBrowserEmulation = @"FEATURE_BROWSER_EMULATION";
    
        #endregion
    
        #region Feature Control Strings (G)
    
        private const string FeatureGpuRendering = @"FEATURE_GPU_RENDERING";
    
        #endregion
    
        #region Feature Control Strings (L)
    
        private const string FeatureBlockLmzScript = @"FEATURE_BLOCK_LMZ_SCRIPT";
    
        #endregion
    
        internal InternetExplorerFeatureControl()
        {
            _processName = $"{Process.GetCurrentProcess().ProcessName}.exe";
            using (var webBrowser = new WebBrowser())
                _version = webBrowser.Version;
        }
    
        internal static InternetExplorerFeatureControl Instance => LazyInstance.Value;
    
        internal RegistryHive RegistryHive { get; set; } = RegistryHive.CurrentUser;
    
        private int GetFeatureControl(string featureControl)
        {
            using (var currentUser = RegistryKey.OpenBaseKey(RegistryHive.CurrentUser, _registryView))
            {
                using (var key = currentUser.CreateSubKey($"{RegistryLocation}\\{featureControl}", false))
                {
                    if (key.GetValue(_processName) is int value)
                    {
                        return value;
                    }
                    return -1;
                }
            }
        }
    
        private void SetFeatureControl(string featureControl, int value)
        {
            using (var currentUser = RegistryKey.OpenBaseKey(RegistryHive, _registryView))
            {
                using (var key = currentUser.CreateSubKey($"{RegistryLocation}\\{featureControl}", true))
                {
                    key.SetValue(_processName, value, RegistryValueKind.DWord);
                }
            }
        }
    
        #region Internet Feature Controls (A)
    
        /// <summary>
        /// Windows Internet Explorer 8 and later. When enabled, feature disables the "about:" protocol. For security reasons, applications that host the WebBrowser Control are strongly encouraged to enable this feature.
        /// By default, this feature is enabled for Windows Internet Explorer and disabled for applications hosting the WebBrowser Control.To enable this feature using the registry, add the name of your executable file to the following setting.
        /// </summary>
        internal bool AboutProtocolRestriction
        {
            get
            {
                if (_version.Major < 8)
                    throw new NotSupportedException($"{AboutProtocolRestriction} requires Internet Explorer 8 and Later.");
                var releaseVersion = new Version(8, 0, 6001, 18702);
                return Convert.ToBoolean(GetFeatureControl(_version >= releaseVersion ? FeatureRestrictAboutProtocolIe7 : FeatureRestrictAboutProtocol));
            }
            set
            {
                if (_version.Major < 8)
                    throw new NotSupportedException($"{AboutProtocolRestriction} requires Internet Explorer 8 and Later.");
                var releaseVersion = new Version(8, 0, 6001, 18702);
                SetFeatureControl(_version >= releaseVersion ? FeatureRestrictAboutProtocolIe7 : FeatureRestrictAboutProtocol, Convert.ToInt16(value));
            }
        }
    
        #endregion
    
        #region Internet Feature Controls (B)
    
        /// <summary>
        /// Windows Internet Explorer 8 and later. Defines the default emulation mode for Internet Explorer and supports the following values.
        /// </summary>
        internal DocumentMode BrowserEmulation
        {
            get
            {
                if (_version.Major < 8)
                    throw new NotSupportedException($"{nameof(BrowserEmulation)} requires Internet Explorer 8 and Later.");
                var value = GetFeatureControl(FeatureBrowserEmulation);
                if (Enum.IsDefined(typeof(DocumentMode), value))
                {
                    return (DocumentMode)value;
                }
                return DocumentMode.NotSet;
            }
            set
            {
                if (_version.Major < 8)
                    throw new NotSupportedException($"{nameof(BrowserEmulation)} requires Internet Explorer 8 and Later.");
                var tmp = value;
                if (value == DocumentMode.DefaultRespectDocType)
                    tmp = DefaultRespectDocType;
                else if (value == DocumentMode.DefaultOverrideDocType)
                    tmp = DefaultOverrideDocType;
                SetFeatureControl(FeatureBrowserEmulation, (int)tmp);
            }
        }
    
        #endregion
    
        #region Internet Feature Controls (G)
    
        /// <summary>
        /// Internet Explorer 9. Enables Internet Explorer to use a graphics processing unit (GPU) to render content. This dramatically improves performance for webpages that are rich in graphics.
        /// By default, this feature is enabled for Internet Explorer and disabled for applications hosting the WebBrowser Control.To enable this feature by using the registry, add the name of your executable file to the following setting.
        /// Note: GPU rendering relies heavily on the quality of your video drivers. If you encounter problems running Internet Explorer with GPU rendering enabled, you should verify that your video drivers are up to date and that they support hardware accelerated graphics.
        /// </summary>
        internal bool GpuRendering
        {
            get
            {
                if (_version.Major < 9)
                    throw new NotSupportedException($"{nameof(GpuRendering)} requires Internet Explorer 9 and Later.");
                return Convert.ToBoolean(GetFeatureControl(FeatureGpuRendering));
            }
            set
            {
                if (_version.Major < 9)
                    throw new NotSupportedException($"{nameof(GpuRendering)} requires Internet Explorer 9 and Later.");
                SetFeatureControl(FeatureGpuRendering, Convert.ToInt16(value));
            }
        }
    
        #endregion
    
        #region Internet Feature Controls (L)
    
        /// <summary>
        /// Internet Explorer 7 and later. When enabled, feature allows scripts stored in the Local Machine zone to be run only in webpages loaded from the Local Machine zone or by webpages hosted by sites in the Trusted Sites list. For more information, see Security and Compatibility in Internet Explorer 7.
        /// By default, this feature is enabled for Internet Explorer and disabled for applications hosting the WebBrowser Control.To enable this feature by using the registry, add the name of your executable file to the following setting.
        /// </summary>
        internal bool LocalScriptBlocking
        {
            get
            {
                if (_version.Major < 7)
                    throw new NotSupportedException($"{nameof(LocalScriptBlocking)} requires Internet Explorer 7 and Later.");
                return Convert.ToBoolean(GetFeatureControl(FeatureBlockLmzScript));
            }
            set
            {
                if (_version.Major < 7)
                    throw new NotSupportedException($"{nameof(LocalScriptBlocking)} requires Internet Explorer 7 and Later.");
                SetFeatureControl(FeatureBlockLmzScript, Convert.ToInt16(value));
            }
        }
    
        #endregion
    
    
        private DocumentMode DefaultRespectDocType
        {
            get
            {
                if (_version.Major >= 11)
                    return DocumentMode.InternetExplorer11RespectDocType;
                switch (_version.Major)
                {
                    case 10:
                        return DocumentMode.InternetExplorer10RespectDocType;
                    case 9:
                        return DocumentMode.InternetExplorer9RespectDocType;
                    case 8:
                        return DocumentMode.InternetExplorer8RespectDocType;
                    default:
                        throw new ArgumentOutOfRangeException();
                }
            }
        }
    
        private DocumentMode DefaultOverrideDocType
        {
            get
            {
                if (_version.Major >= 11)
                    return DocumentMode.InternetExplorer11OverrideDocType;
                switch (_version.Major)
                {
                    case 10:
                        return DocumentMode.InternetExplorer10OverrideDocType;
                    case 9:
                        return DocumentMode.InternetExplorer9OverrideDocType;
                    case 8:
                        return DocumentMode.InternetExplorer8OverrideDocType;
                    default:
                        throw new ArgumentOutOfRangeException();
                }
            }
        }
    }
    
    internal enum DocumentMode
    {
        NotSet = -1,
        [Description("Webpages containing standards-based !DOCTYPE directives are displayed in IE latest installed version mode.")]
        DefaultRespectDocType,
        [Description("Webpages are displayed in IE latest installed version mode, regardless of the declared !DOCTYPE directive.  Failing to declare a !DOCTYPE directive could causes the page to load in Quirks.")]
        DefaultOverrideDocType,
        [Description(
            "Internet Explorer 11. Webpages are displayed in IE11 edge mode, regardless of the declared !DOCTYPE directive. Failing to declare a !DOCTYPE directive causes the page to load in Quirks."
        )] InternetExplorer11OverrideDocType = 11001,
    
        [Description(
            "IE11. Webpages containing standards-based !DOCTYPE directives are displayed in IE11 edge mode. Default value for IE11."
        )] InternetExplorer11RespectDocType = 11000,
    
        [Description(
            "Internet Explorer 10. Webpages are displayed in IE10 Standards mode, regardless of the !DOCTYPE directive."
        )] InternetExplorer10OverrideDocType = 10001,
    
        [Description(
            "Internet Explorer 10. Webpages containing standards-based !DOCTYPE directives are displayed in IE10 Standards mode. Default value for Internet Explorer 10."
        )] InternetExplorer10RespectDocType = 10000,
    
        [Description(
            "Windows Internet Explorer 9. Webpages are displayed in IE9 Standards mode, regardless of the declared !DOCTYPE directive. Failing to declare a !DOCTYPE directive causes the page to load in Quirks."
        )] InternetExplorer9OverrideDocType = 9999,
    
        [Description(
            "Internet Explorer 9. Webpages containing standards-based !DOCTYPE directives are displayed in IE9 mode. Default value for Internet Explorer 9.\r\n" +
            "Important  In Internet Explorer 10, Webpages containing standards - based !DOCTYPE directives are displayed in IE10 Standards mode."
        )] InternetExplorer9RespectDocType = 9000,
    
        [Description(
            "Webpages are displayed in IE8 Standards mode, regardless of the declared !DOCTYPE directive. Failing to declare a !DOCTYPE directive causes the page to load in Quirks."
        )] InternetExplorer8OverrideDocType = 8888,
    
        [Description(
            "Webpages containing standards-based !DOCTYPE directives are displayed in IE8 mode. Default value for Internet Explorer 8\r\n" +
            "Important  In Internet Explorer 10, Webpages containing standards - based !DOCTYPE directives are displayed in IE10 Standards mode."
        )] InternetExplorer8RespectDocType = 8000,
    
        [Description(
            "Webpages containing standards-based !DOCTYPE directives are displayed in IE7 Standards mode. Default value for applications hosting the WebBrowser Control."
        )] InternetExplorer7RespectDocType = 7000
    }
    
  • 0

    一个便宜而简单的解决方法是,您可以在FEATURE_BROWSER_EMULATION键中放置一个大于11001的值 . 然后它需要系统中可用的最新IE .

相关问题