94 votes

Utilisez la dernière version d'Internet Explorer dans le contrôle du navigateur Web.

La version par défaut du contrôle du navigateur web dans un fichier C# Formulaires Windows L'application est 7. J'ai changé à 9 par l'article _Emulation de navigateur_ Mais comment est-il possible d'utiliser la dernière version de l'Internet Explorer installé dans un contrôle de navigateur web ?

104voto

MohD Points 1060

J'ai vu la réponse de Veer. Je pense qu'elle est correcte, mais elle n'a pas fonctionné pour moi. Peut-être que j'utilise .NET 4 et que j'utilise un système d'exploitation 64x, alors veuillez vérifier cela.

Vous pouvez le mettre en place ou le vérifier au démarrage de votre 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();
    }
}

Vous pouvez trouver messagebox.show, juste pour tester.

Les clés sont les suivantes :

  • 11001 (0x2AF9) - Internet Explorer 11. Les pages Web s'affichent en mode IE11 indépendamment de l'option !DOCTYPE directive.

  • 11000 (0x2AF8) - Internet Explorer 11. Les pages Web contenant fondées sur des normes !DOCTYPE s'affichent en mode bordure d'IE11. Valeur par défaut pour IE11.

  • 10001 (0x2711) - Internet Explorer 10. Les pages Web sont affichées en mode Standards IE10 indépendamment de l'option !DOCTYPE directive.

  • 10000 (0x2710) - Internet Explorer 10. Les pages Web contenant des fichiers !DOCTYPE sont affichées en mode standard IE10. Valeur par défaut de pour Internet Explorer 10.

  • 9999 (0x270F) - Internet Explorer 9. Les pages Web sont affichées en mode IE9 en mode standard, indépendamment de l'option !DOCTYPE directive.

  • 9000 (0x2328) - Internet Explorer 9. Les pages Web contenant fondées sur des normes !DOCTYPE sont affichées en mode IE9.

  • 8888 (0x22B8) - Les pages Web s'affichent en mode standard IE8, quel que soit le !DOCTYPE directive.

  • 8000 (0x1F40) - Les pages web contenant des normes !DOCTYPE sont affichées en mode IE8.

  • 7000 (0x1B58) - Les pages web contenant des normes !DOCTYPE sont affichées en mode standard IE7.

_Référence : MSDN : Contrôles des fonctionnalités Internet_

J'ai vu des applications comme Skype utiliser 10001. Je ne sais pas.

NOTE

L'application d'installation va modifier le registre. Vous devrez peut-être ajouter une ligne dans le fichier Manifest pour éviter les erreurs dues aux autorisations de modification du registre :

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

MISE À JOUR 1

Il s'agit d'un cours qui permettra d'obtenir la dernière version d'IE sur Windows et d'apporter les modifications nécessaires ;

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 

}

Utilisation de la classe comme suit

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

vous pouvez faire face à un problème pour dans la comparaison de Windows 10, mai en raison de votre site Web lui-même vous pouvez avoir besoin d'ajouter cette balise méta

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

Profitez-en :)

62voto

RooiWillie Points 351

En utilisant les valeurs de 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);

21voto

dovid Points 4559
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);

D'après ce que j'ai lu ici ( Contrôle de la compatibilité des contrôles WebBrowser :

Que se passe-t-il si je fixe la valeur du mode de document FEATURE_BROWSER_EMULATION à un niveau supérieur à celui de la version d'IE sur le client ?

Évidemment, le contrôle du navigateur ne peut prendre en charge qu'un mode document inférieur ou égal à la version d'IE installée sur le client. L'utilisation de la clé FEATURE_BROWSER_EMULATION fonctionne mieux pour les applications d'entreprise où il existe une version déployée et prise en charge du navigateur. Dans le cas où vous définissez la valeur d'un mode de navigation supérieur à la version du navigateur installé sur le client, le contrôle du navigateur choisira le mode de document le plus élevé disponible.

Le plus simple est de mettre un nombre décimal très élevé...

14voto

user2441511 Points 7423

Plutôt que de changer la RegKey, j'ai pu mettre une ligne dans l'en-tête de mon HTML :

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

        <!-- Insert other header tags here -->
    </head>
    ...
</html>

Voir Contrôle du navigateur Web et spécification de la version d'IE .

13voto

Veer Points 779

Vous pouvez essayer ceci enlace

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X