Web tarayıcısı denetiminde Internet Explorer'ın en son sürümünü kullanın


Yanıtlar:


100

Veer'in cevabını gördüm. Doğru olduğunu düşünüyorum ama kendim için çalışmadım. Belki .NET 4 kullanıyorum ve 64x işletim sistemi kullanıyorum, lütfen bunu kontrol edin.

Kurulumu yapabilir veya uygulamanızın başlangıcında kontrol edebilirsiniz:

private void Form1_Load(object sender, EventArgs e)
{
    var appName = Process.GetCurrentProcess().ProcessName + ".exe";
    SetIE8KeyforWebBrowserControl(appName);
}

private void SetIE8KeyforWebBrowserControl(string appName)
{
    RegistryKey Regkey = null;
    try
    {
        // For 64 bit machine
        if (Environment.Is64BitOperatingSystem)
            Regkey = Microsoft.Win32.Registry.LocalMachine.OpenSubKey(@"SOFTWARE\\Wow6432Node\\Microsoft\\Internet Explorer\\Main\\FeatureControl\\FEATURE_BROWSER_EMULATION", true);
        else  //For 32 bit machine
            Regkey = Microsoft.Win32.Registry.LocalMachine.OpenSubKey(@"SOFTWARE\\Microsoft\\Internet Explorer\\Main\\FeatureControl\\FEATURE_BROWSER_EMULATION", true);

        // If the path is not correct or
        // if the user haven't priviledges to access the registry
        if (Regkey == null)
        {
            MessageBox.Show("Application Settings Failed - Address Not found");
            return;
        }

        string FindAppkey = Convert.ToString(Regkey.GetValue(appName));

        // Check if key is already present
        if (FindAppkey == "8000")
        {
            MessageBox.Show("Required Application Settings Present");
            Regkey.Close();
            return;
        }

        // If a key is not present add the key, Key value 8000 (decimal)
        if (string.IsNullOrEmpty(FindAppkey))
            Regkey.SetValue(appName, unchecked((int)0x1F40), RegistryValueKind.DWord);

        // Check for the key after adding
        FindAppkey = Convert.ToString(Regkey.GetValue(appName));

        if (FindAppkey == "8000")
            MessageBox.Show("Application Settings Applied Successfully");
        else
            MessageBox.Show("Application Settings Failed, Ref: " + FindAppkey);
    }
    catch (Exception ex)
    {
        MessageBox.Show("Application Settings Failed");
        MessageBox.Show(ex.Message);
    }
    finally
    {
        // Close the Registry
        if (Regkey != null)
            Regkey.Close();
    }
}

Messagebox.show'u sadece test etmek için bulabilirsiniz.

Anahtarlar aşağıdaki gibidir:

  • 11001 (0x2AF9) - Internet Explorer 11. !DOCTYPEYönerge ne olursa olsun, web sayfaları IE11 kenar modunda görüntülenir .

  • 11000 (0x2AF8) - Internet Explorer 11. Standartlara dayalı !DOCTYPEyönergeler içeren web sayfaları IE11 kenar modunda görüntülenir. IE11 için varsayılan değer.

  • 10001 (0x2711) - Internet Explorer 10. !DOCTYPEYönerge ne olursa olsun, web sayfaları IE10 Standartları modunda görüntülenir .

  • 10000 (0x2710) - Internet Explorer 10. Standartlara dayalı !DOCTYPEyönergeler içeren web sayfaları IE10 Standartları modunda görüntülenir. Internet Explorer 10 için varsayılan değer.

  • 9999 (0x270F) - Internet Explorer 9. !DOCTYPEYönerge ne olursa olsun, web sayfaları IE9 Standartları modunda görüntülenir .

  • 9000 (0x2328) - Internet Explorer 9. Standartlara dayalı !DOCTYPEyönergeler içeren web sayfaları IE9 modunda görüntülenir.

  • 8888 (0x22B8)!DOCTYPE Yönerge ne olursa olsun, web sayfaları IE8 Standartları modunda görüntülenir .

  • 8000 (0x1F40) - Standartlara dayalı !DOCTYPE yönergeler içeren web sayfaları IE8 modunda görüntülenir.

  • 7000 (0x1B58) - Standartlara dayalı !DOCTYPE yönergeler içeren web sayfaları IE7 Standartları modunda görüntülenir.

Başvuru: MSDN: İnternet Özelliği Denetimleri

Skype gibi uygulamaların 10001 kullandığını gördüm. Bilmiyorum.

NOT

Kurulum uygulaması kayıt defterini değiştirecektir. Kayıt defterindeki değişiklik izinlerinden kaynaklanan hataları önlemek için Manifest Dosyasına bir satır eklemeniz gerekebilir:

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

GÜNCELLEME 1

Bu sınıf, IE'nin en son sürümünü pencerelerde alacak ve olması gerektiği gibi değişiklikler yapacak;

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 


}

sınıfın takip edildiği gibi kullanılması

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

Windows 10'un karşılaştırılabilirliğinde bir sorunla karşılaşabilirsiniz, web sitenizin kendisinden dolayı bu meta etiketi eklemeniz gerekebilir

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

Zevk almak :)


2
MSDN'den: "Kayıt yeniden yönlendiricisi, WOW64 üzerindeki kayıt defterinin belirli bölümlerinin ayrı mantıksal görünümlerini sağlayarak 32 bit ve 64 bit uygulamaları izole eder. Kayıt defteri yeniden yönlendiricisi, ilgili mantıksal kayıt defteri görünümlerine 32 bit ve 64 bit kayıt defteri çağrılarını engeller ve bunları ilgili fiziksel kayıt defteri konumuna eşler. Yeniden yönlendirme işlemi uygulamaya şeffaftır. Bu nedenle, 32 bitlik bir uygulama, veriler farklı bir konumda saklansa bile kayıt defteri verilerine 32 bit Windows'ta çalışıyormuş gibi erişebilir. 64-bit Windows "Wow6432Node hakkında endişelenmenize gerek yok
Luca Manzo

2
Ayrıca HKEY_CURRENT_USER kullanabilirsiniz, yöneticiye gerek yoktur.
Michael Chourdakis

4
Bir öneri: Değişim Environment.Is64BitOperatingSystemiçin Environment.Is64BitProcess.
CC Inc

1
@JobaDiniz lütfen UPDATE 1'in size yardımcı olacağını kontrol edin :)
Mhmd

4
Bunun birkaç yaşında olduğunu biliyorum, ancak gelecekteki okuyucular için: Uygulamanızın 64 bitlik bir sistemde veya hatta 64 bitlik bir işlemde çalışıp çalışmadığını kontrol etmesine gerek yok. Windows'un 64 bit sürümleri, 64 bitlik bir sistemde çalışan 32 bit uygulamaları otomatik olarak alt anahtara yeniden yönlendirecek Kayıt Yeniden Yönlendiricisini uyguladı Wow6432Node. Uygulamanızın bu 'yeni' anahtara uyum sağlamak için fazladan bir şey yapması gerekmez.
Visual Vincent

61

Değerleri kullanarak 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
Dostum, bu sürümü almanın daha kolay bir yolu ... Teşekkürler, bu benim için çalışıyor!
sfaust

Teşekkürler, OpenSubKey anahtar yoksa null döndüreceğinden CreateSubKeybunun yerine kullanılmalıdır OpenSubKey.
2017

Harika nokta! Yanıtı CreateSubKey'i kullanmak ve değeri yalnızca ayarlanmadığında ayarlamak için düzenledim.
RooiWillie

Harika! Çok teşekkür ederim. En iyi cevap bu olmalıdır. Yukarıdaki canavar çözümünü denedim ama fark yok. Bu yaklaştı onu çiviledi. Tekrar teşekkürler!
Matt

1
@MarkNS Bu durumda, sıfır kontrolü yapabilir ve ardından yazmadan önce bir sürüm kontrolü yapabilirsiniz. Bunun arkasındaki mantık basitçe kayıt defterine sürekli yazmaktan kaçınmaktır, ancak bu konuda sorun yoksa, boş kontrolü kaldırabilirsiniz.
RooiWillie

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

Burada okuduğuma göre ( WebBrowser Kontrol Uyumluluğunu Kontrol Etme :

FEATURE_BROWSER_EMULATION Belge Modu Değerini İstemcideki IE Sürümünden Daha Yüksek Ayarladığımda Ne Olur?

Açıktır ki, tarayıcı kontrolü yalnızca istemcide yüklü olan IE sürümünden daha düşük veya ona eşit olan bir belge modunu destekleyebilir. FEATURE_BROWSER_EMULATION anahtarını kullanmak, tarayıcının dağıtılmış ve desteklenmiş bir sürümünün bulunduğu kurumsal iş kolu uygulamaları için en iyi sonucu verir. Değeri, istemcide yüklü olan tarayıcı sürümünden daha yüksek bir sürüm olan bir tarayıcı moduna ayarlamanız durumunda, tarayıcı kontrolü mevcut en yüksek belge modunu seçecektir.

En basit şey, çok yüksek bir ondalık sayı koymaktır ...


Not: Win64'te 32 bit uygulama çalıştırıyorsanız, düzenleme gerektiren anahtar aşağıdadır SOFTWARE\WOW6432Node\Microsoft.... Kodda otomatik olarak yeniden yönlendirilir, ancak regedit'i açarsanız sizi şaşırtabilir.
toster-cx

1
kısa ve tatlı. Benim Registry.LocalMachine.OpenSubKey(".. için Win2012 sunucusunda yönetici olarak çalıştı.
bendecko

@bendecko, çünkü uygulamanızın yönetici ayrıcalığına ihtiyacı var.
dovid

/! \ bu çözümü kullanmayın /! \ coz eğer navigate kullanırsanız (yerel bir dosyaya) ve HTML içeriğiniz Intranet bölgesinde ise (örn: localhost'a bir MOTW kullanarak) IE7'ye geri dönecektir. 99999 kullanmak, 11000 kullanmakla aynı davranışa sahip olacaktır. Yukarıda bahsettiğim sorunu çözmek için 11001'e ihtiyacınız olacak.
Lenor

13

RegKey'i değiştirmek yerine, HTML başlığıma bir satır koyabildim:

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

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

Bkz. Web Tarayıcısı Kontrolü ve IE Sürümünü Belirleme .


Bu teknik çalışırken, aynı Kullanıcı Aracısını vermez. İle FEATURE_BROWSER_EMULATIONteknik, ben olsun Mozilla/5.0 (Windows NT 6.2; Win64; x64; ...ile Oysa X-UA-Compatibleteknik, ben olsun Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.2; ...Google Analytics'in bir Mobile gibi algılar.
Benoit Blanchon

1
Teşekkür ederim! İhtiyacınız olan tek şey yerel bir sayfa barındırmak olduğunda mükemmel bir şekilde çalışır (böylece kullanıcı aracısı dizesi tamamen alakasızdır).
realMarkusSchmidt

12

Bu bağlantıyı deneyebilirsiniz

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 = (new WebBrowser ()). Version.ToString ();
Veer

Güzel, sadece kayıt defterini kontrol etmek istedim HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Internet Explorerama bu daha basit. teşekkürler
Moslem7026

5
Nedir Processes.getCurrentProcessName()? Olabilir Process.GetCurrentProcess().ProcessNamemi?
SerG

1
LocalMachine.getOrCreateSubKey nedir? Mevcut değil?
TEK

2
Ayrıca HKEY_CURRENT_USER kullanabilirsiniz, yöneticiye gerek yoktur.
Michael Chourdakis

4

Burada genellikle kullandığım ve benim için çalıştığım yöntem (hem 32 bit hem de 64 bit uygulamalar için; ie_emulation burada belgelenen herhangi biri olabilir: İnternet Özellik Denetimleri (B..C), Tarayıcı Emülasyonu ):

    [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

Luca'nın çözümünü uygulayabildim, ancak işe yaraması için birkaç değişiklik yapmam gerekiyordu. Amacım, D3.js'yi bir Windows Forms Uygulaması için Web Tarayıcısı kontrolüyle birlikte kullanmaktı (.NET 2.0'ı hedefliyordu). Şimdi benim için çalışıyor. Umarım bu başka birine yardımcı olabilir.

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

Ayrıca proje ayarlarına 11999 değerinde bir string (ie_emulation) ekledim. Bu değer IE11 (11.0.15) için çalışıyor gibi görünüyor.

Ardından, kayıt defterine erişime izin vermek için uygulamamın iznini değiştirmem gerekti. Bu, projenize yeni bir öğe ekleyerek (VS2012 kullanılarak) yapılabilir. Genel Öğeler altında, Uygulama Manifest Dosyası'nı seçin. Seviyeyi Invoker'den requiredAdministrator olarak değiştirin (aşağıda gösterildiği gibi).

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

Bunu okuyan biri D3.js'yi bir web tarayıcısı kontrolüyle kullanmaya çalışıyorsa, JSON verilerini HTML sayfanızın içindeki bir değişken içinde depolanacak şekilde değiştirmeniz gerekebilir çünkü D3.json XmlHttpRequest (web sunucusuyla kullanımı daha kolay) kullanır. Bu değişikliklerden ve yukarıdakilerden sonra, Windows formlarım D3'ü çağıran yerel HTML dosyalarını yükleyebilir.


2

RooiWillie ve MohD'nin yanıtlarını birleştirin ve
uygulamanızı yönetim hakkı ile çalıştırmayı unutmayın.

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
daha önce de belirtildiği gibi, localmachine anahtar kaydı kullanmak yönetici tarafından uygulama kurulumunu sınırlarken, mevcut kullanıcı anahtarı normal kullanıcıların uygulamayı yüklemesine izin veriyor. geç daha esnektir
gg89

1

html'nize aşağıdakileri eklemek hile kayıt defteri ayarlarına gerek kalmaz

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

head meta etiketi WebBrowser'a nasıl eklenir? Kayıt defterini ekleyemiyorum çünkü uygulamam varsayılan kabuk olarak Kullanıcı hesabında çalıştırılacak (bağımsız uygulama web tarayıcısı olarak)
Luiey

0

Visual Basic Sürümü:

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

Bunun yayınlandığını biliyorum ama burada kullandığımın üzerinde dotnet 4.5 için güncel bir sürüm var. Belge türüne göre varsayılan tarayıcı öykünmesini kullanmanızı öneririm

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
Onunla ne yapmalı? .. Nasıl kullanılır? Ne aranmalı ve ne zaman?
Kosmos

İsterseniz kodun ilk öğle yemeğinde çağırırsınız. codeInternetExplorerFeatureControl.Instance.BrowserEmulation = DocumentMode.DefaultRespectDocType'ı kullanmak için ; ' Bunun nereye çekildiğini daha iyi anlamak için msdn.microsoft.com/en-us/ie/… adresine bakabilirsiniz.
Justin Davis

Ayrıca not eklemek için, bunu etkinleştirmek için yönetici hakları gerektirmez. Ayrıca, bitlik temelinde doğru kayıt defterini seçecek ve belgelerin gösterdiği aynı kısıtlamaları koyacaktır. Çalışmak için IE 9 gerektiren GPU oluşturma gibi
Justin Davis

0

Bunun için ucuz ve kolay bir çözüm, FEATURE_BROWSER_EMULATION anahtarına 11001'den büyük bir değer girebilmenizdir. Ardından sistemde bulunan en son IE'yi alır.


0

Mümkün olan en yüksek modu zorlamak en iyisidir. Bu ekleyerek gerçekleştirilebilir:

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

ve IE'yi desteklemek için polyfill kitaplığını dahil etmek her zaman iyidir:

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

herhangi bir senaryodan önce.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.