Verwenden Sie die neueste Version von Internet Explorer im Webbrowser-Steuerelement


85

Die Standardversion des Webbrowser-Steuerelements in einer C # Windows Forms- Anwendung ist 7. Ich habe durch den Artikel Browser-Emulation auf 9 geändert. Wie ist es jedoch möglich, die neueste Version des installierten Internet Explorers in einem Webbrowser-Steuerelement zu verwenden?

Antworten:


98

Ich habe Veers Antwort gesehen. Ich denke es ist richtig, aber ich habe nicht für mich gearbeitet. Vielleicht verwende ich .NET 4 und ein 64x-Betriebssystem. Bitte überprüfen Sie dies.

Sie können das Setup einrichten oder es beim Start Ihrer Anwendung überprüfen:

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

Möglicherweise finden Sie messagebox.show nur zum Testen.

Die Schlüssel lauten wie folgt:

  • 11001 (0x2AF9) - Internet Explorer 11. Webseiten werden unabhängig von der !DOCTYPEDirektive im IE11-Edge-Modus angezeigt .

  • 11000 (0x2AF8) - Internet Explorer 11. Webseiten mit standardbasierten !DOCTYPEAnweisungen werden im IE11-Edge-Modus angezeigt. Standardwert für IE11.

  • 10001 (0x2711) - Internet Explorer 10. Webseiten werden unabhängig von der !DOCTYPEAnweisung im IE10-Standardmodus angezeigt .

  • 10000 (0x2710) - Internet Explorer 10. Webseiten mit standardbasierten !DOCTYPEAnweisungen werden im IE10-Standardmodus angezeigt. Standardwert für Internet Explorer 10.

  • 9999 (0x270F) - Internet Explorer 9. Webseiten werden unabhängig von der !DOCTYPEAnweisung im IE9-Standardmodus angezeigt .

  • 9000 (0x2328) - Internet Explorer 9. Webseiten mit standardbasierten !DOCTYPEAnweisungen werden im IE9-Modus angezeigt.

  • 8888 (0x22B8) - Webseiten werden unabhängig von der !DOCTYPEDirektive im IE8-Standardmodus angezeigt .

  • 8000 (0x1F40) - Webseiten mit standardbasierten !DOCTYPE Anweisungen werden im IE8-Modus angezeigt.

  • 7000 (0x1B58) - Webseiten mit standardbasierten !DOCTYPE Anweisungen werden im IE7-Standardmodus angezeigt.

Referenz: MSDN: Internet Feature Controls

Ich habe gesehen, dass Anwendungen wie Skype 10001 verwenden. Ich weiß es nicht.

HINWEIS

Die Setup-Anwendung ändert die Registrierung. Möglicherweise müssen Sie der Manifestdatei eine Zeile hinzufügen, um Fehler aufgrund von Berechtigungen zum Ändern der Registrierung zu vermeiden:

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

UPDATE 1

Dies ist eine Klasse, die die neueste Version von IE unter Windows erhält und die erforderlichen Änderungen vornimmt.

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 


}

Verwendung der Klasse wie folgt

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

Möglicherweise haben Sie ein Problem mit der Vergleichbarkeit von Windows 10, möglicherweise müssen Sie aufgrund Ihrer Website selbst dieses Meta-Tag hinzufügen

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

Genießen :)


2
Von MSDN: "Der Registrierungs-Redirector isoliert 32-Bit- und 64-Bit-Anwendungen, indem er separate logische Ansichten bestimmter Teile der Registrierung auf WOW64 bereitstellt. Der Registrierungs-Redirector fängt 32-Bit- und 64-Bit-Registrierungsaufrufe an ihre jeweiligen logischen Registrierungsansichten und ab ordnet sie dem entsprechenden physischen Registrierungsspeicherort zu. Der Umleitungsprozess ist für die Anwendung transparent. Daher kann eine 32-Bit-Anwendung auf Registrierungsdaten zugreifen, als ob sie unter 32-Bit-Windows ausgeführt würde, selbst wenn die Daten an einem anderen Speicherort gespeichert sind 64-Bit-Windows "Sie müssen sich keine Sorgen um Wow6432Node machen
Luca Manzo

2
Sie können auch HKEY_CURRENT_USER verwenden, ohne dass ein Administrator erforderlich ist.
Michael Chourdakis

4
Ein Vorschlag: Wechseln Sie Environment.Is64BitOperatingSystemzu Environment.Is64BitProcess.
CC Inc

1
@JobaDiniz überprüfen Sie bitte UPDATE 1 wird Ihnen helfen :)
Mhmd

4
Ich weiß, dass dies ein paar Jahre alt ist, aber für zukünftige Leser: Ihre Anwendung muss nicht überprüfen, ob sie in einem 64-Bit-System oder sogar in einem 64-Bit-Prozess ausgeführt wird. 64-Bit-Versionen von Windows haben den Registrierungs-Redirector implementiert, der 32-Bit-Apps, die auf einem 64-Bit-System ausgeführt werden, automatisch auf den Wow6432NodeUnterschlüssel umleitet . Ihre Anwendung muss nichts extra tun, um sich an diesen "neuen" Schlüssel anzupassen.
Visual Vincent

59

Verwenden der Werte von 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);

1
Alter, das ist ein viel einfacherer Weg, um die Version zu bekommen ... Danke, das funktioniert bei mir!
sfaust

Danke, netter Code, außer dass CreateSubKeydieser verwendet werden sollte, OpenSubKeyda OpenSubKey null zurückgibt, wenn der Schlüssel nicht existiert.
Eug

Toller Punkt! Ich habe die Antwort bearbeitet, um CreateSubKey zu verwenden und den Wert nur festzulegen, wenn er nicht festgelegt wurde.
RooiWillie

Genial! Ich danke dir sehr. Dies sollte am besten beantwortet werden. Versuchte die Monsterlösung oben, aber keinen Unterschied. Dies näherte sich genagelt. Danke noch einmal!
Matt

1
@MarkNS Nun, in diesem Fall könnten Sie die Nullprüfung und dann eine Versionsprüfung durchführen, bevor Sie sie schreiben. Die Logik dahinter besteht einfach darin, das ständige Schreiben in die Registrierung zu vermeiden. Wenn Sie damit einverstanden sind, können Sie die Nullprüfung einfach entfernen.
RooiWillie

16
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);

Nach dem, was ich hier gelesen habe ( Steuern der WebBrowser-Steuerungskompatibilität :

Was passiert, wenn ich den Wert für den FEATURE_BROWSER_EMULATION-Dokumentmodus höher als die IE-Version auf dem Client einstelle?

Offensichtlich kann das Browsersteuerelement nur einen Dokumentmodus unterstützen, der kleiner oder gleich der auf dem Client installierten IE-Version ist. Die Verwendung des Schlüssels FEATURE_BROWSER_EMULATION eignet sich am besten für Unternehmensanwendungen, für die eine bereitgestellte und unterstützte Version des Browsers vorhanden ist. Wenn Sie den Wert auf einen Browsermodus festlegen, der eine höhere Version als die auf dem Client installierte Browserversion ist, wählt das Browsersteuerelement den höchsten verfügbaren Dokumentmodus.

Am einfachsten ist es, eine sehr hohe Dezimalzahl einzugeben ...


Hinweis: Wenn Sie eine 32-Bit-App unter win64 ausführen, befindet sich der Schlüssel, der bearbeitet werden muss SOFTWARE\WOW6432Node\Microsoft.... Es wird automatisch im Code umgeleitet, kann Sie jedoch überraschen, wenn Sie regedit öffnen.
Toster-CX

1
kurz und süß. Für mich Registry.LocalMachine.OpenSubKey(".. arbeitete auf Win2012 Server als Admin.
Bendecko

@bendecko, damit Ihre Anwendung Administratorrechte benötigt.
Dovid

/! \ Verwenden Sie diese Lösung nicht /! \ coz, da sie auf IE7 zurückfällt, wenn Sie navigieren (zu einer lokalen Datei) und Ihr HTML-Inhalt sich in der Intranetzone befindet (z. B. Verwenden eines MOTW für localhost). Die Verwendung eines 99999 hätte das gleiche Verhalten wie die Verwendung von 11000. Um das oben erwähnte Problem zu lösen, benötigen Sie 11001.
Lenor

12

Sie können diesen Link versuchen

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

string ver = (neuer WebBrowser ()). Version.ToString ();
Veer

Gut, ich wollte nur die Registrierung einchecken, HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Internet Exploreraber dieser Weg ist einfacher. danke
Moslem7026

5
Was ist das Processes.getCurrentProcessName()? Kann sein Process.GetCurrentProcess().ProcessName?
SerG

1
Was ist localMachine.getOrCreateSubKey? Ist nicht vorhanden?
TEK

2
Sie können auch HKEY_CURRENT_USER verwenden, ohne dass ein Administrator erforderlich ist.
Michael Chourdakis

12

Anstatt den RegKey zu ändern, konnte ich eine Zeile in die Kopfzeile meines HTML-Codes einfügen:

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

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

Siehe Webbrowser-Steuerung und Angeben der IE-Version .


Während diese Technik funktioniert, gibt es nicht den gleichen Benutzeragenten. Mit der FEATURE_BROWSER_EMULATIONTechnik bekomme ich, Mozilla/5.0 (Windows NT 6.2; Win64; x64; ...während ich mit der X-UA-CompatibleTechnik bekomme Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.2; ..., die Google Analytics als Handy erkennt.
Benoit Blanchon

Danke dir! Funktioniert einwandfrei, wenn Sie lediglich eine lokale Seite hosten müssen (die Zeichenfolge des Benutzeragenten ist also völlig irrelevant).
RealMarkusSchmidt

4

Hier die Methode, die ich normalerweise verwende und die für mich funktioniert (sowohl für 32-Bit- als auch für 64-Bit-Anwendungen; dh_emulation kann jeder sein, der hier dokumentiert ist: 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();
        }
    }

4

Ich konnte Lucas Lösung implementieren, musste aber einige Änderungen vornehmen, damit sie funktioniert. Mein Ziel war es, D3.js mit einem Webbrowser-Steuerelement für eine Windows Forms-Anwendung (für .NET 2.0) zu verwenden. Es funktioniert jetzt für mich. Ich hoffe das kann jemand anderem helfen.

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

Außerdem habe ich den Projekteinstellungen eine Zeichenfolge (ie_emulation) mit dem Wert 11999 hinzugefügt. Dieser Wert scheint für IE11 (11.0.15) zu funktionieren.

Als nächstes musste ich die Berechtigung für meine Anwendung ändern, um den Zugriff auf die Registrierung zu ermöglichen. Dies kann durch Hinzufügen eines neuen Elements zu Ihrem Projekt erfolgen (mithilfe von VS2012). Wählen Sie unter Allgemeine Elemente die Option Anwendungsmanifestdatei aus. Ändern Sie die Ebene von asInvoker in requireAdministrator (wie unten gezeigt).

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

Wenn jemand, der dies liest, versucht, D3.js mit einem Webbrowser-Steuerelement zu verwenden, müssen Sie möglicherweise die JSON-Daten ändern, die in einer Variablen auf Ihrer HTML-Seite gespeichert werden sollen, da D3.json XmlHttpRequest verwendet (einfacher mit einem Webserver zu verwenden). Nach diesen und den oben genannten Änderungen können meine Windows-Formulare lokale HTML-Dateien laden, die D3 aufrufen.


2

Kombinieren Sie die Antworten von RooiWillie und MohD
und denken Sie daran, Ihre App mit Administratorrechten auszuführen.

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

1
Wie bereits erwähnt, beschränkt die Verwendung des lokalen Maschinenschlüsselregisters die App-Installation durch den Administrator, während der aktuelle Benutzerschlüssel es regulären Benutzern ermöglicht, die App zu installieren.
Letzteres

1

Wenn Sie nur Folgendes zu Ihrem HTML-Code hinzufügen, sind keine Registrierungseinstellungen erforderlich

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

Wie füge ich das Head-Meta-Tag zu WebBrowser hinzu? Ich kann die Registrierung nicht hinzufügen, da meine Anwendung auf dem Benutzerkonto als Standard-Shell (als Webbrowser für eigenständige Anwendungen) ausgeführt wird
Luiey

0

Visual Basic-Version:

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

0

Ich weiß, dass dies gepostet wurde, aber hier ist eine aktuelle Version für dotnet 4.5, die ich oben verwende. Ich empfehle, die Standard-Browser-Emulation zu verwenden, die den Doctype berücksichtigt

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
}

1
Was tun damit? .. Wie benutzt man es? Wie und wann anrufen?
Kosmos

Sie rufen es beim ersten Mittagessen des Codes auf, wenn Sie möchten. So verwenden Sie codeInternetExplorerFeatureControl.Instance.BrowserEmulation = DocumentMode.DefaultRespectDocType; ' Zum besseren Verständnis, wo dies gezogen wurde, können Sie auf msdn.microsoft.com/en-us/ie/…
Justin Davis

Zum Hinzufügen von Hinweisen sind für diese Option keine Administratorrechte erforderlich. Außerdem wird die richtige Registrierung basierend auf der Bitigkeit ausgewählt und die gleichen Einschränkungen festgelegt, die in der Dokumentation angezeigt werden. Wie GPU-Rendering, das IE 9 benötigt, um zu funktionieren
Justin Davis

0

Eine kostengünstige und einfache Problemumgehung besteht darin, dass Sie einfach einen Wert, der größer als 11001 ist, in den Schlüssel FEATURE_BROWSER_EMULATION eingeben können. Dann wird der neueste IE benötigt, der im System verfügbar ist.


0

Es ist am besten, den höchstmöglichen Modus zu erzwingen. Dies kann erreicht werden, indem hinzugefügt wird:

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

und es ist immer gut, die Polyfill-Bibliothek einzuschließen, um IE zu unterstützen:

<script src="https://polyfill.io/v3/polyfill.min.js?features=es6"></script>

vor jedem Skript.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.