Użyj najnowszej wersji przeglądarki Internet Explorer w formancie przeglądarki internetowej

88

Domyślna wersja kontrolki przeglądarki internetowej w aplikacji C # Windows Forms to 7. Zmieniłem na 9 w artykule Emulacja przeglądarki , ale jak można użyć najnowszej wersji zainstalowanej przeglądarki Internet Explorer w kontrolce przeglądarki internetowej?

Muzułmanin7026
źródło

Odpowiedzi:

99

Widziałem odpowiedź Veera. Myślę, że to w porządku, ale to nie zadziałało dla mnie. Może używam .NET 4 i używam 64x OS, więc proszę sprawdzić to.

Możesz skonfigurować lub sprawdzić to podczas uruchamiania aplikacji:

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

Możesz znaleźć messagebox.show, tylko do testowania.

Klucze są następujące:

  • 11001 (0x2AF9) - Internet Explorer 11. Strony internetowe są wyświetlane w trybie brzegowym IE11, niezależnie od !DOCTYPEdyrektywy.

  • 11000 (0x2AF8) - Internet Explorer 11. Strony internetowe zawierające !DOCTYPEdyrektywy oparte na standardach są wyświetlane w trybie krawędzi IE11. Wartość domyślna dla IE11.

  • 10001 (0x2711) - Internet Explorer 10. Strony internetowe są wyświetlane w trybie standardów IE10, niezależnie od !DOCTYPEdyrektywy.

  • 10000 (0x2710) - Internet Explorer 10. Strony internetowe zawierające !DOCTYPEdyrektywy oparte na standardach są wyświetlane w trybie standardów IE10. Wartość domyślna dla przeglądarki Internet Explorer 10.

  • 9999 (0x270F) - Internet Explorer 9. Strony internetowe są wyświetlane w trybie standardów IE9, niezależnie od !DOCTYPEdyrektywy.

  • 9000 (0x2328) - Internet Explorer 9. Strony internetowe zawierające !DOCTYPEdyrektywy oparte na standardach są wyświetlane w trybie IE9.

  • 8888 (0x22B8) - Strony internetowe są wyświetlane w trybie standardów IE8, niezależnie od !DOCTYPEdyrektywy.

  • 8000 (0x1F40) - Strony internetowe zawierające !DOCTYPE dyrektywy oparte na standardach są wyświetlane w trybie IE8.

  • 7000 (0x1B58) - strony internetowe zawierające !DOCTYPE dyrektywy oparte na standardach są wyświetlane w trybie standardów IE7.

Odniesienie: MSDN: Internet Feature Controls

Widziałem aplikacje takie jak Skype używające 10001. Nie wiem.

UWAGA

Aplikacja instalacyjna zmieni rejestr. Może być konieczne dodanie wiersza w pliku manifestu, aby uniknąć błędów związanych z uprawnieniami do zmiany w rejestrze:

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

AKTUALIZACJA 1

Jest to klasa, która pobierze najnowszą wersję IE w systemie Windows i wprowadzi zmiany tak, jak powinny;

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 


}

użycie klasy, jak następuje

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

możesz napotkać problem z porównywalnością systemu Windows 10, może z powodu samej witryny może być konieczne dodanie tego metatagu

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

Cieszyć się :)

Mhmd
źródło
2
Z MSDN: „Readresator rejestru izoluje aplikacje 32-bitowe i 64-bitowe, udostępniając osobne widoki logiczne niektórych części rejestru w WOW64. Readresator rejestru przechwytuje 32-bitowe i 64-bitowe wywołania rejestru do odpowiednich logicznych widoków rejestru i mapuje je na odpowiednią fizyczną lokalizację rejestru. Proces przekierowania jest niewidoczny dla aplikacji. Dlatego aplikacja 32-bitowa może uzyskać dostęp do danych rejestru tak, jakby była uruchomiona w 32-bitowym systemie Windows, nawet jeśli dane są przechowywane w innej lokalizacji w 64-bitowy system Windows „Nie musisz się martwić o Wow6432Node
Luca Manzo
2
Możesz też użyć klucza HKEY_CURRENT_USER, bez administratora.
Michael Chourdakis
4
Jedna sugestia: Zmień Environment.Is64BitOperatingSystemna Environment.Is64BitProcess.
CC Inc
1
@JobaDiniz uprzejmie sprawdź UPDATE 1 pomoże ci :)
Mhmd
4
Wiem, że to kilka lat, ale dla przyszłych czytelników: Twoja aplikacja nie musi sprawdzać, czy działa w systemie 64-bitowym, czy nawet w procesie 64-bitowym. W 64-bitowych wersjach systemu Windows zaimplementowano Redirector rejestru, który automatycznie przekierowuje 32-bitowe aplikacje działające w systemie 64-bitowym do Wow6432Nodepodklucza. Twoja aplikacja nie musi robić nic więcej, aby dostosować się do tego „nowego” klucza.
Visual Vincent
60

Używając wartości z 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);
RooiWillie
źródło
1
Stary, to o wiele łatwiejszy sposób na zdobycie wersji ... Dzięki, to działa dla mnie!
sfaust,
Dzięki, ładny kod, z wyjątkiem tego, że CreateSubKeypowinien być używany zamiast, OpenSubKeyponieważ OpenSubKey zwróci wartość null, jeśli klucz nie istnieje.
eug
Świetna uwaga! Edytowałem odpowiedź, aby użyć CreateSubKey i ustawić wartość tylko wtedy, gdy nie została ustawiona.
RooiWillie
Niesamowite! Dziękuję bardzo. To powinna być najlepsza odpowiedź. Wypróbowałem powyższe rozwiązanie potwora, ale bez różnicy. To zbliżyło się do tego. Dzięki jeszcze raz!
Matt,
1
@MarkNS Cóż, w takim przypadku możesz wykonać sprawdzenie zerowe, a następnie sprawdzenie wersji przed napisaniem. Logika stojąca za tym polega po prostu na unikaniu ciągłego zapisywania w rejestrze, ale jeśli nie masz nic przeciwko temu, możesz po prostu usunąć sprawdzanie zerowe.
RooiWillie
18
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);

Zgodnie z tym, co przeczytałem tutaj ( Controlling WebBrowser Control Compatibility :

Co się stanie, jeśli ustawię wartość trybu dokumentu FEATURE_BROWSER_EMULATION na wyższą niż wersja IE na kliencie?

Oczywiście formant przeglądarki może obsługiwać tylko taki tryb dokumentu, który jest mniejszy lub równy wersji IE zainstalowanej na kliencie. Użycie klucza FEATURE_BROWSER_EMULATION działa najlepiej w przypadku biznesowych aplikacji biznesowych, w których jest wdrożona i obsługiwana wersja przeglądarki. W przypadku ustawienia wartości na tryb przeglądarki w wersji wyższej niż wersja przeglądarki zainstalowana na kliencie, formant przeglądarki wybierze najwyższy dostępny tryb dokumentu.

Najprościej jest wpisać bardzo dużą liczbę dziesiętną ...

dovid
źródło
Uwaga: jeśli używasz 32-bitowej aplikacji na win64, klucz wymagający edycji znajduje się poniżej SOFTWARE\WOW6432Node\Microsoft.... Jest automatycznie przekierowywany w kodzie, ale może Cię zaskoczyć, jeśli otworzysz regedit.
toster-cx
1
krótko i słodko. U mnie Registry.LocalMachine.OpenSubKey(".. pracowałem na serwerze Win2012 jako admin.
bendecko
@bendecko, fot, że Twoja aplikacja wymaga uprawnień administratora.
dovid
/! \ nie używaj tego rozwiązania /! \ coz przejdzie do IE7, jeśli użyjesz nawigacji (do pliku lokalnego), a zawartość HTML znajduje się w strefie intranetu (np. używając MOTW do localhost). Używanie 99999 miałoby takie samo zachowanie jak używanie 11000. Aby rozwiązać problem, o którym wspomniałem powyżej, potrzebujesz 11001.
Lenor
12

Możesz spróbować tego linku

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();
}
Skręcać
źródło
string ver = (new WebBrowser ()). Version.ToString ();
Veer
Dobrze, chciałem tylko sprawdzić w rejestrze, HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Internet Explorerale to jest prostsze. dzięki
Moslem7026
5
Co to jest Processes.getCurrentProcessName()? Może być Process.GetCurrentProcess().ProcessName?
SerG
1
Co to jest localMachine.getOrCreateSubKey? Nie istnieje?
TEK
2
Możesz też użyć klucza HKEY_CURRENT_USER, bez administratora.
Michael Chourdakis
12

Zamiast zmieniać RegKey, mogłem umieścić linię w nagłówku mojego 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>

Zobacz temat Kontrola przeglądarki internetowej i określanie wersji IE .

user2441511
źródło
Chociaż ta technika działa, nie zapewnia tego samego agenta użytkownika. Z FEATURE_BROWSER_EMULATIONtechniką otrzymuję Mozilla/5.0 (Windows NT 6.2; Win64; x64; ...Natomiast dzięki X-UA-Compatibletechnice otrzymuję Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.2; ..., którą Google Analytics wykrywa jako urządzenie mobilne.
Benoit Blanchon
Dziękuję Ci! Działa doskonale, gdy wszystko, czego potrzebujesz, to hostować lokalną stronę (więc ciąg agenta użytkownika jest całkowicie nieistotny).
realMarkusSchmidt
4

Tutaj metoda, której zwykle używam i działa dla mnie (zarówno dla aplikacji 32-bitowych, jak i 64-bitowych; tj. Emulacja może być udokumentowana tutaj przez każdego: 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();
        }
    }
Luca Manzo
źródło
4

Udało mi się zaimplementować rozwiązanie Luca, ale musiałem wprowadzić kilka zmian, aby to zadziałało. Moim celem było użycie D3.js z kontrolką przeglądarki sieci Web dla aplikacji Windows Forms (przeznaczonej dla platformy .NET 2.0). Teraz działa dla mnie. Mam nadzieję, że to pomoże komuś innemu.

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

Dodałem również do ustawień projektu ciąg (ie_emulation) o wartości 11999. Ta wartość wydaje się działać dla IE11 (11.0.15).

Następnie musiałem zmienić uprawnienia mojej aplikacji, aby umożliwić dostęp do rejestru. Można to zrobić, dodając nowy element do projektu (za pomocą VS2012). W obszarze Elementy ogólne wybierz opcję Plik manifestu aplikacji. Zmień poziom z asInvoker na requireAdministrator (jak pokazano poniżej).

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

Jeśli ktoś czytający to próbuje użyć D3.js z kontrolką przeglądarki internetowej, może być konieczne zmodyfikowanie danych JSON, które mają być przechowywane w zmiennej wewnątrz strony HTML, ponieważ D3.json używa XmlHttpRequest (łatwiejszego w użyciu z serwerem sieciowym). Po tych zmianach i powyższych, moje formularze Windows mogą ładować lokalne pliki HTML, które wywołują D3.

Jason Ausborn
źródło
2

Połącz odpowiedzi RooiWillie i MohD
i pamiętaj, aby uruchomić swoją aplikację z uprawnieniami administratora.

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();
}
mjb
źródło
1
jak ludzie zauważyli wcześniej, użycie rejestru kluczy localmachine ogranicza instalację aplikacji przez administratora, podczas gdy bieżący klucz użytkownika pozwala zwykłym użytkownikom zainstalować aplikację. późniejszy jest bardziej elastyczny
gg89
1

samo dodanie następującego kodu do html załatwia sprawę bez konieczności ustawiania rejestru

<meta http-equiv="X-UA-Compatible" content="IE=11" >
Jeroen
źródło
jak dodać tag meta head do WebBrowser? Nie mogę dodać rejestru, ponieważ moja aplikacja będzie uruchamiana na koncie użytkownika jako domyślna powłoka (jako samodzielna przeglądarka internetowa aplikacji)
Luiey
0

Wersja 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
Aube Robert
źródło
0

Wiem, że to zostało opublikowane, ale tutaj jest aktualna wersja dla dotnet 4.5 powyżej, którego używam. Zalecam użycie domyślnej emulacji przeglądarki uwzględniającej 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
}
Justin Davis
źródło
1
Co z tym zrobić? .. Jak z niego korzystać? Co zadzwonić i kiedy?
Kosmos
Jeśli chcesz, zadzwoń do niego podczas pierwszego lunchu kodu. Aby użyć codeInternetExplorerFeatureControl.Instance.BrowserEmulation = DocumentMode.DefaultRespectDocType; ' Aby lepiej zrozumieć, gdzie to się stało, możesz spojrzeć na msdn.microsoft.com/en-us/ie/ ...
Justin Davis
Aby dodać notatkę, ta nie wymaga uprawnień administratora do włączenia. Wybierze również poprawny rejestr na podstawie bitowości i ustawi te same ograniczenia, które pokazuje dokumentacja. Takich jak renderowanie GPU wymagające do działania IE 9
Justin Davis,
0

Tanim i łatwym obejściem tego problemu jest to, że możesz po prostu wpisać wartość, która jest większa niż 11001 w kluczu FEATURE_BROWSER_EMULATION. Następnie pobiera najnowszą IE, która jest dostępna w systemie.

Aakash Uniyal
źródło
0

Najlepiej jest wymusić najwyższy możliwy tryb. Można to osiągnąć, dodając:

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

i zawsze dobrze jest dołączyć bibliotekę polyfill, aby obsługiwać IE:

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

przed jakimkolwiek skryptem.

Ezaw
źródło