Gunakan versi terbaru Internet Explorer di kontrol browser web

88

Versi default dari kontrol browser web di aplikasi C # Windows Forms adalah 7. Saya telah mengubah ke 9 oleh artikel Emulasi Browser , tetapi bagaimana mungkin menggunakan versi terbaru dari Internet Explorer yang terinstal di kontrol browser web?

Muslim 7026
sumber

Jawaban:

100

Saya melihat jawaban Veer. Saya pikir itu benar, tetapi tidak saya berhasil untuk saya. Mungkin saya menggunakan .NET 4 dan saya menggunakan 64x OS jadi silakan periksa ini.

Anda dapat mengatur atau memeriksanya saat memulai aplikasi Anda:

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

Anda mungkin menemukan messagebox.show, hanya untuk pengujian.

Kunci-kuncinya adalah sebagai berikut:

  • 11001 (0x2AF9) - Internet Explorer 11. Halaman web ditampilkan dalam mode edge IE11, apa pun !DOCTYPEpetunjuknya.

  • 11000 (0x2AF8) - Internet Explorer 11. Halaman web yang berisi !DOCTYPEarahan berbasis standar ditampilkan dalam mode edge IE11. Nilai default untuk IE11.

  • 10001 (0x2711) - Internet Explorer 10. Halaman web ditampilkan dalam mode Standar IE10, apa pun !DOCTYPEpetunjuknya.

  • 10.000 (0x2710) - Internet Explorer 10. Halaman web yang berisi !DOCTYPEarahan berbasis standar ditampilkan dalam mode Standar IE10. Nilai default untuk Internet Explorer 10.

  • 9999 (0x270F) - Internet Explorer 9. Halaman web ditampilkan dalam mode Standar IE9, apa pun !DOCTYPEpetunjuknya.

  • 9000 (0x2328) - Internet Explorer 9. Halaman web yang berisi !DOCTYPEarahan berbasis standar ditampilkan dalam mode IE9.

  • 8888 (0x22B8) - Halaman web ditampilkan dalam mode Standar IE8, apa pun !DOCTYPEpetunjuknya.

  • 8000 (0x1F40) - Halaman web yang berisi !DOCTYPE arahan berbasis standar ditampilkan dalam mode IE8.

  • 7000 (0x1B58) - Halaman web yang berisi !DOCTYPE arahan berbasis standar ditampilkan dalam mode Standar IE7.

Referensi: MSDN: Kontrol Fitur Internet

Saya melihat aplikasi seperti Skype menggunakan 10001. Saya tidak tahu.

CATATAN

Aplikasi pengaturan akan mengubah registri. Anda mungkin perlu menambahkan baris di File Manifes untuk menghindari kesalahan karena izin perubahan dalam registri:

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

UPDATE 1

Ini adalah kelas yang akan mendapatkan versi terbaru dari IE di windows dan melakukan perubahan sebagaimana mestinya;

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 


}

penggunaan kelas sebagai berikut

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

Anda mungkin menghadapi masalah karena sebanding dengan windows 10, mungkin karena situs web Anda sendiri, Anda mungkin perlu menambahkan tag meta ini

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

Nikmati :)

Mhmd
sumber
2
Dari MSDN: "Pengarah ulang registri mengisolasi aplikasi 32-bit dan 64-bit dengan memberikan pandangan logis terpisah dari bagian tertentu dari registri di WOW64. Pengalih registri menyadap panggilan registri 32-bit dan 64-bit ke masing-masing tampilan registri logis dan memetakannya ke lokasi fisik registri yang sesuai. Proses pengalihan transparan ke aplikasi tersebut. Oleh karena itu, aplikasi 32-bit dapat mengakses data registri seolah-olah dijalankan pada Windows 32-bit meskipun datanya disimpan di lokasi yang berbeda di Windows 64-bit "Anda tidak perlu khawatir tentang Wow6432Node
Luca Manzo
2
Anda juga dapat menggunakan HKEY_CURRENT_USER, tidak perlu admin.
Michael Chourdakis
4
Satu saran: Ubah Environment.Is64BitOperatingSystemke Environment.Is64BitProcess.
CC Inc
1
@JobaDiniz dengan hormat memeriksa UPDATE 1 akan membantu Anda :)
Mhmd
4
Saya tahu ini berusia beberapa tahun, tetapi untuk pembaca di masa mendatang: Aplikasi Anda tidak perlu memeriksa apakah berjalan dalam sistem 64-bit atau bahkan dalam proses 64-bit. Versi 64-bit Windows menerapkan Pengarah Registri yang secara otomatis akan mengarahkan aplikasi 32-bit yang berjalan pada sistem 64-bit ke Wow6432Nodesubkunci. Aplikasi Anda tidak perlu melakukan apa pun untuk beradaptasi dengan kunci 'baru' ini.
Visual Vincent
61

Menggunakan nilai dari 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
sumber
1
Sobat, itu cara yang lebih mudah untuk mendapatkan versi ... Terima kasih, ini berhasil untuk saya!
sfaust
Terima kasih, kode yang bagus kecuali yang CreateSubKeyharus digunakan daripada OpenSubKeykarena OpenSubKey akan mengembalikan null jika kuncinya tidak ada.
eug
Poin yang bagus! Saya mengedit jawaban untuk menggunakan CreateSubKey dan hanya mengatur nilai jika belum diatur.
RooiWillie
Hebat! Terima kasih banyak. Ini harus menjadi jawaban terbaik. Mencoba solusi monster di atas tetapi tidak ada perbedaan. Ini mendekati berhasil. Terima kasih lagi!
Matt
1
@MarkNS Nah, dalam contoh itu, Anda bisa melakukan pemeriksaan null dan kemudian pemeriksaan versi sebelum menulisnya. Logika di baliknya adalah untuk menghindari penulisan konstan ke registri, tetapi jika Anda setuju dengan itu, Anda cukup menghapus centang nol.
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);

Menurut apa yang saya baca di sini ( Mengontrol Kompatibilitas Kontrol Browser Web :

Apa yang Terjadi jika Saya Menetapkan Nilai Mode Dokumen FEATURE_BROWSER_EMULATION Lebih Tinggi dari Versi IE pada Klien?

Jelasnya, kontrol browser hanya dapat mendukung mode dokumen yang kurang dari atau sama dengan versi IE yang diinstal pada klien. Menggunakan kunci FEATURE_BROWSER_EMULATION berfungsi paling baik untuk lini aplikasi bisnis perusahaan yang memiliki versi browser yang diterapkan dan didukung. Jika Anda menyetel nilai ke mode browser dengan versi yang lebih tinggi daripada versi browser yang diinstal di klien, kontrol browser akan memilih mode dokumen tertinggi yang tersedia.

Hal yang paling sederhana adalah memasukkan angka desimal yang sangat tinggi ...

dovid
sumber
Catatan: jika Anda menjalankan aplikasi 32bit di win64, kunci yang perlu diedit ada di bawah SOFTWARE\WOW6432Node\Microsoft.... Ini diarahkan secara otomatis dalam kode, tetapi mungkin mengejutkan Anda jika Anda membuka regedit.
toster-cx
1
pendek dan manis. Bagi saya Registry.LocalMachine.OpenSubKey(".. bekerja di server Win2012 sebagai admin.
bendecko
@bendecko, jika aplikasi Anda memerlukan hak administrator.
dovid
/! \ jangan gunakan solusi ini /! \ karena itu akan fallback di IE7 jika Anda menggunakan navigasi (ke file lokal) dan konten HTML Anda ada di zona Intranet (misal: menggunakan MOTW ke localhost). Menggunakan 99999 akan memiliki perilaku yang sama daripada menggunakan 11000. Sementara untuk menyelesaikan masalah yang saya sebutkan di atas, Anda memerlukan 11001.
Lenor
13

Daripada mengubah RegKey, saya dapat membuat baris di header HTML saya:

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

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

Lihat Kontrol Browser Web & Menentukan Versi IE .

pengguna2441511
sumber
Meskipun teknik ini berhasil, teknik ini tidak memberikan Agen Pengguna yang sama. Dengan FEATURE_BROWSER_EMULATIONteknik, saya mendapatkan Mozilla/5.0 (Windows NT 6.2; Win64; x64; ...Sedangkan, dengan X-UA-Compatibleteknik, saya mendapatkan Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.2; ..., yang dideteksi Google Analytics sebagai Seluler.
Benoit Blanchon
1
Terima kasih! Berfungsi dengan baik jika yang Anda butuhkan hanyalah menghosting halaman lokal (jadi string agen pengguna sama sekali tidak relevan).
realMarkusSchmidt
12

Anda dapat mencoba tautan ini

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();
}
Membelok
sumber
string ver = (WebBrowser baru ()). Version.ToString ();
Veer
Bagus, saya hanya ingin memeriksa registri HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Internet Explorertetapi cara ini lebih sederhana. terima kasih
Moslem7026
5
Apa itu Processes.getCurrentProcessName()? Mungkin Process.GetCurrentProcess().ProcessName?
SerG
1
Apa itu localMachine.getOrCreateSubKey? Tidak ada?
TEK
2
Anda juga dapat menggunakan HKEY_CURRENT_USER, tidak perlu admin.
Michael Chourdakis
4

Di sini metode yang biasanya saya gunakan dan bekerja untuk saya (baik untuk aplikasi 32 bit dan 64 bit; ie_emulation dapat didokumentasikan oleh siapa saja di sini: Kontrol Fitur Internet (B..C), Emulasi Browser ):

    [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
sumber
4

Saya dapat menerapkan solusi Luca, tetapi saya harus membuat beberapa perubahan agar dapat berfungsi. Tujuan saya adalah menggunakan D3.js dengan kontrol Browser Web untuk Aplikasi Windows Forms (menargetkan .NET 2.0). Ini bekerja untuk saya sekarang. Saya harap ini dapat membantu orang lain.

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

Juga, saya menambahkan string (ie_emulation) ke pengaturan proyek dengan nilai 11999. Nilai ini tampaknya berfungsi untuk IE11 (11.0.15).

Selanjutnya, saya harus mengubah izin aplikasi saya untuk mengizinkan akses ke registri. Ini dapat dilakukan dengan menambahkan item baru ke proyek Anda (menggunakan VS2012). Di bawah Item Umum, pilih File Manifes Aplikasi. Ubah level dari asInvoker menjadi requireAdministrator (seperti yang ditunjukkan di bawah).

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

Jika seseorang yang membaca ini mencoba menggunakan D3.js dengan kontrol browser web, Anda mungkin harus mengubah data JSON untuk disimpan dalam variabel di dalam halaman HTML Anda karena D3.json menggunakan XmlHttpRequest (lebih mudah digunakan dengan server web). Setelah perubahan itu dan di atas, formulir windows saya dapat memuat file HTML lokal yang memanggil D3.

Jason Ausborn
sumber
2

Gabungkan jawaban RooiWillie dan MohD
dan ingat untuk menjalankan aplikasi Anda dengan hak administratif.

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
sumber
1
Seperti yang ditunjukkan orang sebelumnya, menggunakan register kunci mesin lokal membatasi penginstalan aplikasi oleh administrator sementara kunci pengguna saat ini memungkinkan pengguna biasa untuk menginstal aplikasi. nanti lebih fleksibel
gg89
1

hanya menambahkan berikut ini ke html Anda tidak perlu untuk pengaturan registri

<meta http-equiv="X-UA-Compatible" content="IE=11" >
Jeroen
sumber
bagaimana cara menambahkan tag meta kepala ke WebBrowser? Saya tidak dapat menambahkan registri karena aplikasi saya akan dijalankan pada akun Pengguna sebagai shell default (sebagai browser web aplikasi mandiri)
Luiey
0

Versi 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
sumber
0

Saya tahu ini telah diposting tetapi ini adalah versi terbaru untuk dotnet 4.5 di atas yang saya gunakan. Saya merekomendasikan untuk menggunakan emulasi browser default yang menghormati 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
sumber
1
Apa hubungannya dengan itu? .. Bagaimana cara menggunakannya? Apa yang harus dihubungi dan kapan?
Kosmos
Anda menyebutnya saat makan siang kode pertama jika Anda suka. Untuk menggunakan codeInternetExplorerFeatureControl.Instance.BrowserEmulation = DocumentMode.DefaultRespectDocType; ' Untuk pemahaman yang lebih baik di mana ini ditarik, Anda dapat melihat msdn.microsoft.com/en-us/ie/…
Justin Davis
Juga untuk menambahkan catatan, yang ini tidak memerlukan hak administrator untuk mengaktifkannya. Ini juga akan memilih registri yang benar berdasarkan bitness dan menetapkan batasan yang sama seperti yang ditunjukkan dokumentasi. Seperti rendering GPU yang membutuhkan IE 9 untuk berfungsi
Justin Davis
0

Solusi yang murah dan mudah untuk itu adalah Anda cukup memasukkan nilai yang lebih besar dari 11001 di kunci FEATURE_BROWSER_EMULATION. Kemudian dibutuhkan IE terbaru yang tersedia di sistem.

Aakash Uniyal
sumber
0

Yang terbaik adalah memaksakan mode setinggi mungkin. Itu dapat dicapai dengan menambahkan:

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

dan selalu baik untuk menyertakan pustaka polyfill untuk mendukung IE:

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

sebelum skrip apa pun.

Esau
sumber