ใช้ Internet Explorer เวอร์ชันล่าสุดในการควบคุมเว็บเบราว์เซอร์


88

เวอร์ชันเริ่มต้นของตัวควบคุมเว็บเบราว์เซอร์ใน แอปพลิเคชันC # Windows Formsคือ 7 ฉันได้เปลี่ยนเป็น 9 โดยบทความBrowser Emulationแต่จะใช้ Internet Explorer เวอร์ชันล่าสุดที่ติดตั้งในตัวควบคุมเว็บเบราว์เซอร์ได้อย่างไร

คำตอบ:


100

ฉันเห็นคำตอบของเวียร์ ฉันคิดว่ามันถูกต้อง แต่มันไม่ได้ผลสำหรับฉัน บางทีฉันใช้. NET 4 และใช้ระบบปฏิบัติการ 64x ดังนั้นโปรดตรวจสอบสิ่งนี้

คุณสามารถตั้งค่าหรือตรวจสอบในการเริ่มต้นแอปพลิเคชันของคุณ:

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 สำหรับการทดสอบเท่านั้น

คีย์มีดังต่อไปนี้:

  • 11001 (0x2AF9) - Internet Explorer 11 หน้าเว็บจะแสดงในโหมดขอบ IE11 โดยไม่คำนึงถึง!DOCTYPEคำสั่ง

  • 11000 (0x2AF8) - Internet Explorer 11 หน้าเว็บที่มี!DOCTYPEคำสั่งตามมาตรฐานจะแสดงในโหมดขอบ IE11 ค่าดีฟอลต์สำหรับ IE11

  • 10001 (0x2711) - หน้าเว็บของ Internet Explorer 10 จะแสดงในโหมดมาตรฐานของ IE10 โดยไม่คำนึงถึง!DOCTYPEคำสั่ง

  • 10,000 (0x2710) - Internet Explorer 10 หน้าเว็บที่มี!DOCTYPEคำสั่งตามมาตรฐาน จะแสดงในโหมดมาตรฐาน IE10 ค่าดีฟอลต์สำหรับ Internet Explorer 10

  • 9999 (0x270F) - Internet Explorer 9 หน้าเว็บจะแสดงในโหมดมาตรฐานของ IE9 โดยไม่คำนึงถึง!DOCTYPEคำสั่ง

  • 9000 (0x2328) - Internet Explorer 9 หน้าเว็บที่มี!DOCTYPEคำสั่งตามมาตรฐานจะแสดงในโหมด IE9

  • 8888 (0x22B8) - หน้าเว็บจะแสดงในโหมดมาตรฐาน IE8 โดยไม่คำนึงถึง!DOCTYPEคำสั่ง

  • 8000 (0x1F40) - หน้าเว็บที่มี!DOCTYPE คำสั่งตามมาตรฐานจะแสดงในโหมด IE8

  • 7000 (0x1B58) - หน้าเว็บที่มี!DOCTYPE คำสั่งตามมาตรฐานจะแสดงในโหมดมาตรฐาน IE7

อ้างอิง: MSDN: การควบคุมคุณสมบัติอินเทอร์เน็ต

ฉันเห็นแอปพลิเคชันเช่น Skype ใช้ 10001 ฉันไม่ทราบว่า

บันทึก

แอปพลิเคชันการตั้งค่าจะเปลี่ยนรีจิสทรี คุณอาจต้องเพิ่มบรรทัดในไฟล์ Manifest เพื่อหลีกเลี่ยงข้อผิดพลาดเนื่องจากสิทธิ์ในการเปลี่ยนแปลงรีจิสทรี:

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

อัปเดต 1

นี่คือคลาสที่จะได้รับ IE เวอร์ชันล่าสุดบน windows และทำการเปลี่ยนแปลงตามที่ควรจะเป็น

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 


}

โดยใช้คลาสดังต่อไปนี้

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

คุณอาจประสบปัญหาในการเปรียบเทียบกับ windows 10 เนื่องจากเว็บไซต์ของคุณเองคุณอาจต้องเพิ่มเมตาแท็กนี้

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

สนุก :)


2
จาก MSDN: "ตัวเปลี่ยนเส้นทางรีจิสทรีแยกแอปพลิเคชัน 32 บิตและ 64 บิตโดยให้มุมมองเชิงตรรกะแยกกันของบางส่วนของรีจิสทรีบน WOW64 ตัวเปลี่ยนเส้นทางรีจิสทรีจะสกัดกั้นการเรียกใช้รีจิสทรี 32 บิตและ 64 บิตไปยังมุมมองรีจิสทรีแบบลอจิคัลตามลำดับและ แมปไปยังตำแหน่งที่ตั้งของรีจิสทรีทางกายภาพที่สอดคล้องกันกระบวนการเปลี่ยนเส้นทางมีความโปร่งใสกับแอปพลิเคชันดังนั้นแอปพลิเคชันแบบ 32 บิตจึงสามารถเข้าถึงข้อมูลรีจิสทรีได้เหมือนกับว่ากำลังทำงานบน Windows 32 บิตแม้ว่าข้อมูลจะถูกเก็บไว้ในตำแหน่งอื่นบน Windows 64 บิต "คุณไม่จำเป็นต้องกังวลเกี่ยวกับ Wow6432Node
Luca Manzo

2
คุณสามารถใช้ HKEY_CURRENT_USER ได้โดยไม่จำเป็นต้องมีผู้ดูแลระบบ
Michael Chourdakis

4
หนึ่งคำแนะนำ: การเปลี่ยนแปลงไปEnvironment.Is64BitOperatingSystem Environment.Is64BitProcess
CC Inc

1
@JobaDiniz โปรดตรวจสอบ UPDATE 1 จะช่วยคุณได้ :)
Mhmd

4
ฉันรู้ว่านี่เป็นเวลาสองสามปี แต่สำหรับผู้อ่านในอนาคต: แอปพลิเคชันของคุณไม่จำเป็นต้องตรวจสอบว่าทำงานในระบบ 64 บิตหรือแม้กระทั่งในกระบวนการ 64 บิต Windows รุ่น 64 บิตใช้Registry Redirectorซึ่งจะเปลี่ยนเส้นทางแอป 32 บิตที่ทำงานบนระบบ 64 บิตไปยังWow6432Nodeคีย์ย่อยโดยอัตโนมัติ แอปพลิเคชันของคุณไม่จำเป็นต้องทำอะไรเพิ่มเติมเพื่อปรับให้เข้ากับคีย์ 'ใหม่' นี้
Visual Vincent

61

ใช้ค่าจาก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
เพื่อนนั่นเป็นวิธีที่ง่ายกว่าในการรับเวอร์ชัน ... ขอบคุณมันใช้ได้กับฉัน!
sfaust

ขอบคุณรหัสที่ดียกเว้นว่าCreateSubKeyควรใช้แทนOpenSubKeyเนื่องจาก OpenSubKey จะคืนค่า null หากไม่มีคีย์
EUG

จุดเยี่ยม! ฉันแก้ไขคำตอบเพื่อใช้ CreateSubKey และตั้งค่าเฉพาะเมื่อยังไม่ได้ตั้งค่า
RooiWillie

สุดยอด! ขอบคุณมาก. นี่น่าจะตอบได้ดีที่สุด ลองใช้วิธีแก้ปัญหามอนสเตอร์ด้านบน แต่ไม่มีความแตกต่าง วิธีนี้ตอกมัน ขอบคุณอีกครั้ง!
Matt

1
@MarkNS ในกรณีนั้นคุณสามารถทำการตรวจสอบค่าว่างจากนั้นตรวจสอบเวอร์ชันก่อนที่จะเขียน ตรรกะเบื้องหลังนั้นเป็นเพียงเพื่อหลีกเลี่ยงการเขียนลงในรีจิสทรีอย่างต่อเนื่อง แต่ถ้าคุณพอใจกับสิ่งนั้นคุณสามารถลบการตรวจสอบว่าง
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);

ตามสิ่งที่ฉันอ่านที่นี่ ( การควบคุมความเข้ากันได้ของการควบคุมเว็บเบราว์เซอร์ :

จะเกิดอะไรขึ้นถ้าฉันตั้งค่าโหมดเอกสาร FEATURE_BROWSER_EMULATION สูงกว่าเวอร์ชัน IE บนไคลเอนต์

เห็นได้ชัดว่าการควบคุมเบราว์เซอร์สามารถรองรับโหมดเอกสารที่น้อยกว่าหรือเท่ากับเวอร์ชัน IE ที่ติดตั้งบนไคลเอนต์เท่านั้น การใช้คีย์ FEATURE_BROWSER_EMULATION จะทำงานได้ดีที่สุดสำหรับแอปธุรกิจในกลุ่มองค์กรที่มีเบราว์เซอร์เวอร์ชันที่ปรับใช้และรองรับ ในกรณีที่คุณตั้งค่าเป็นโหมดเบราว์เซอร์ที่เป็นเวอร์ชันที่สูงกว่าเวอร์ชันเบราว์เซอร์ที่ติดตั้งบนไคลเอ็นต์ตัวควบคุมเบราว์เซอร์จะเลือกโหมดเอกสารสูงสุด

สิ่งที่ง่ายที่สุดคือการใส่ตัวเลขทศนิยมที่สูงมาก ...


หมายเหตุ: หากคุณกำลังใช้งานแอพพลิเค 32bit บน Win64 SOFTWARE\WOW6432Node\Microsoft...สำคัญที่ความต้องการแก้ไขที่อยู่ภายใต้ มีการเปลี่ยนเส้นทางโดยอัตโนมัติในรหัส แต่อาจทำให้คุณประหลาดใจหากคุณเปิด regedit
toster-cx

1
สั้น 'n หวาน สำหรับฉันRegistry.LocalMachine.OpenSubKey(".. ทำงานบนเซิร์ฟเวอร์ Win2012 ในฐานะผู้ดูแลระบบ
bendecko

@bendecko ว่าแอปพลิเคชันของคุณต้องการสิทธิ์ของผู้ดูแลระบบ
dovid

/! \ don't use this solution /! \ coz it will fallback on IE7 if you use navigation (to a local file) and that your HTML content is in the Intranet zone (ex: using a MOTW to localhost). การใช้ 99999 จะมีลักษณะการทำงานเหมือนกันมากกว่าการใช้ 11000 ในขณะที่จะแก้ไขปัญหาที่ฉันกล่าวถึงข้างต้นคุณจะต้องใช้ 11001
Lenor

13

แทนที่จะเปลี่ยน RegKey ฉันสามารถใส่บรรทัดในส่วนหัวของ 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>

ดูเว็บเบราเซอร์ควบคุมและระบุรุ่นของ IE


แม้ว่าเทคนิคนี้จะใช้ได้ผล แต่ก็ไม่ได้ให้ User Agent คนเดียวกัน ด้วยFEATURE_BROWSER_EMULATIONเทคนิคนี้ฉันได้รับในMozilla/5.0 (Windows NT 6.2; Win64; x64; ...ขณะที่ด้วยX-UA-Compatibleเทคนิคที่ฉันได้รับMozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.2; ...ซึ่ง Google Analytics ตรวจพบว่าเป็นอุปกรณ์เคลื่อนที่
Benoit Blanchon

1
ขอขอบคุณ! ทำงานได้ดีอย่างสมบูรณ์เมื่อสิ่งที่คุณต้องการคือการโฮสต์เพจท้องถิ่น (ดังนั้นสตริงตัวแทนผู้ใช้จึงไม่เกี่ยวข้องโดยสิ้นเชิง)
realMarkusSchmidt

12

คุณสามารถลองใช้ลิงค์นี้

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

สตริง ver = (WebBrowser ใหม่ ()) เวอร์ชัน ToString ();
Veer

ดีฉันแค่ต้องการเช็คอินรีจิสทรีHKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Internet Explorerแต่วิธีนี้ง่ายกว่า ขอบคุณ
Moslem7026

5
คืออะไรProcesses.getCurrentProcessName()? อาจเป็นProcess.GetCurrentProcess().ProcessName?
SerG

1
localMachine.getOrCreateSubKey คืออะไร? ไม่ได้อยู่?
TEK

2
คุณสามารถใช้ HKEY_CURRENT_USER ได้โดยไม่จำเป็นต้องมีผู้ดูแลระบบ
Michael Chourdakis

4

นี่คือวิธีการที่ฉันมักจะใช้และใช้ได้กับฉัน (ทั้งสำหรับแอปพลิเคชัน 32 บิตและ 64 บิต ie_emulation สามารถมีเอกสารได้ที่นี่: การควบคุมคุณลักษณะอินเทอร์เน็ต (B..C), การจำลองเบราว์เซอร์ )

    [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 ได้ แต่ฉันต้องทำการเปลี่ยนแปลงเล็กน้อยเพื่อให้มันใช้งานได้ เป้าหมายของฉันคือการใช้ D3.js กับการควบคุมเว็บเบราว์เซอร์สำหรับ Windows Forms Application (กำหนดเป้าหมาย. NET 2.0) ตอนนี้กำลังทำงานให้ฉัน ฉันหวังว่านี่จะช่วยคนอื่นได้

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

นอกจากนี้ฉันยังเพิ่มสตริง (ie_emulation) ในการตั้งค่าของโปรเจ็กต์ด้วยค่า 11999 ค่านี้ดูเหมือนจะใช้ได้กับ IE11 (11.0.15)

ต่อไปฉันต้องเปลี่ยนสิทธิ์สำหรับแอปพลิเคชันของฉันเพื่ออนุญาตให้เข้าถึงรีจิสทรี สามารถทำได้โดยการเพิ่มรายการใหม่ในโปรเจ็กต์ของคุณ (โดยใช้ VS2012) ภายใต้รายการทั่วไปเลือกไฟล์ Manifest ของแอปพลิเคชัน เปลี่ยนระดับจาก asInvoker เป็น requireAdministrator (ดังแสดงด้านล่าง)

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

หากมีคนอ่านสิ่งนี้พยายามใช้ D3.js กับการควบคุมเว็บเบราว์เซอร์คุณอาจต้องแก้ไขข้อมูล JSON เพื่อเก็บไว้ในตัวแปรภายในหน้า HTML ของคุณเนื่องจาก D3.json ใช้ XmlHttpRequest (ใช้กับเว็บเซิร์ฟเวอร์ได้ง่ายขึ้น) หลังจากการเปลี่ยนแปลงเหล่านั้นและข้างต้นฟอร์ม windows ของฉันจะสามารถโหลดไฟล์ HTML ในเครื่องที่เรียก D3 ได้


2

รวมคำตอบของ RooiWillie และ MohD
และอย่าลืมเรียกใช้แอปของคุณด้วยสิทธิ์ระดับผู้ดูแลระบบ

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
ตามที่ผู้คนระบุไว้ก่อนหน้านี้การใช้การลงทะเบียนคีย์ localmachine จะ จำกัด การติดตั้งแอปโดยผู้ดูแลระบบในขณะที่รหัสผู้ใช้ปัจจุบันอนุญาตให้ผู้ใช้ทั่วไปติดตั้งแอปได้ ต่อมามีความยืดหยุ่นมากขึ้น
gg89

1

เพียงแค่เพิ่มสิ่งต่อไปนี้ลงใน html ของคุณก็ไม่จำเป็นต้องใช้การตั้งค่ารีจิสทรี

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

จะเพิ่มเมตาแท็กส่วนหัวในเว็บเบราว์เซอร์ได้อย่างไร? ฉันไม่สามารถเพิ่มรีจิสทรีได้เนื่องจากแอปพลิเคชันของฉันจะทำงานบนบัญชีผู้ใช้เป็นเชลล์เริ่มต้น (เป็นเว็บเบราว์เซอร์แอปพลิเคชันแบบสแตนด์อโลน)
Luiey

0

เวอร์ชัน 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

0

ฉันรู้ว่ามีการโพสต์ แต่นี่เป็นเวอร์ชันปัจจุบันสำหรับ dotnet 4.5 ด้านบนที่ฉันใช้ ฉันขอแนะนำให้ใช้การจำลองเบราว์เซอร์เริ่มต้นที่เกี่ยวข้องกับประเภทหลัก

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
เอาไปทำอะไร? .. ใช้ยังไง? จะโทรหาอะไรและเมื่อไหร่?
Kosmos

คุณเรียกมันในช่วงอาหารกลางวันมื้อแรกของรหัสถ้าคุณต้องการ ในการใช้ codeInternetExplorerFeatureControl.Instance.BrowserEmulation = DocumentMode.DefaultRespectDocType; ' เพื่อความเข้าใจที่ดีขึ้นว่าสิ่งนี้ถูกดึงไปที่ใดคุณสามารถดูได้ที่ msdn.microsoft.com/en-us/ie/…
Justin Davis

นอกจากนี้ในการเพิ่มบันทึกย่อนี้ไม่ต้องการสิทธิ์ของผู้ดูแลระบบในการเปิดใช้งาน นอกจากนี้ยังจะเลือกรีจิสทรีที่ถูกต้องตามบิตเนสและกำหนดข้อ จำกัด เดียวกันกับที่เอกสารแสดง เช่นการเรนเดอร์ GPU ต้องใช้ IE 9 ในการทำงาน
Justin Davis

0

วิธีแก้ปัญหาที่ง่ายและราคาถูกคือคุณสามารถใส่ค่าที่มากกว่า 11001 ในคีย์ FEATURE_BROWSER_EMULATION จากนั้นใช้ IE ล่าสุดที่มีอยู่ในระบบ


0

ที่ดีที่สุดคือบังคับใช้โหมดสูงสุดที่เป็นไปได้ ซึ่งสามารถทำได้โดยเพิ่ม:

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

และเป็นการดีที่จะรวมไลบรารี polyfill ไว้เพื่อรองรับ IE:

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

ก่อนสคริปต์ใด ๆ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.