一尘不染

在Webbrowser控件中使用Internet Explorer的最新版本

c#

C#Windows Forms
应用程序中webbrowser控件的默认版本为7。 浏览器仿真 文章将我更改为9
,但是如何在webbrowser控件中使用最新版本的已安装Internet Explorer?


阅读 849

收藏
2020-05-19

共1个答案

一尘不染

我看到了维尔的答案。我认为是正确的,但是我没有为我工作。也许我正在使用.NET 4,并且正在使用64x OS,所以请检查一下。

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

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,仅用于测试。

键如下:

  • 11001(0x2AF9) -Internet Explorer11。无论!DOCTYPE指令如何,网页均以IE11边缘模式显示。

  • 11000(0x2AF8) -Internet
    Explorer11。包含基于标准的!DOCTYPE指令的网页以IE11边缘模式显示。IE11的默认值。

  • 10001(0x2711) -Internet
    Explorer10。无论使用何种!DOCTYPE指令,网页均以IE10标准模式显示。

  • 10000(0x2710) -Internet Explorer10。包含基于标准的!DOCTYPE指令的网页
    以IE10标准模式显示。Internet Explorer 10的默认值。

  • 9999(0x270F) -Internet Explorer9。无论使用何种!DOCTYPE指令,网页均以IE9标准模式显示。

  • 9000(0x2328) -Internet Explorer9。包含基于标准的!DOCTYPE指令的网页以IE9模式显示。

  • 8888(0x22B8) -网页以IE8标准模式显示,与!DOCTYPE指令无关。

  • 8000(0x1F40) -包含基于标准的!DOCTYPE 指令的网页以IE8模式显示。

  • 7000(0x1B58) -包含基于标准的!DOCTYPE 指令的网页以IE7标准模式显示。

参考: MSDN:Internet功能控件

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

注意

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

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

更新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" >

请享用 :)

2020-05-19