Sử dụng phiên bản mới nhất của Internet Explorer trong điều khiển trình duyệt web


Câu trả lời:


99

Tôi đã thấy câu trả lời của Veer. Tôi nghĩ nó đúng, nhưng nó không hiệu quả với tôi. Có lẽ tôi đang sử dụng .NET 4 và đang sử dụng hệ điều hành 64x nên vui lòng kiểm tra điều này.

Bạn có thể cài đặt hoặc kiểm tra nó khi khởi động ứng dụng của mình:

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

Bạn có thể tìm thấy messagebox.show, chỉ để thử nghiệm.

Các phím như sau:

  • 11001 (0x2AF9) - Internet Explorer 11. Các trang web được hiển thị ở chế độ cạnh IE11, bất kể !DOCTYPEchỉ thị nào.

  • 11000 (0x2AF8) - Internet Explorer 11. Các trang web chứa !DOCTYPEchỉ thị dựa trên tiêu chuẩn được hiển thị ở chế độ cạnh IE11. Giá trị mặc định cho IE11.

  • 10001 (0x2711) - Internet Explorer 10. Các trang web được hiển thị ở chế độ Tiêu chuẩn IE10, bất kể !DOCTYPEchỉ thị nào.

  • 10000 (0x2710) - Internet Explorer 10. Các trang web chứa !DOCTYPEchỉ thị dựa trên tiêu chuẩn được hiển thị trong chế độ Tiêu chuẩn IE10. Giá trị mặc định cho Internet Explorer 10.

  • 9999 (0x270F) - Internet Explorer 9. Các trang web được hiển thị ở chế độ Tiêu chuẩn IE9, bất kể !DOCTYPEchỉ thị nào.

  • 9000 (0x2328) - Internet Explorer 9. Các trang web chứa !DOCTYPEchỉ thị dựa trên tiêu chuẩn được hiển thị ở chế độ IE9.

  • 8888 (0x22B8) - Các trang web được hiển thị ở chế độ Tiêu chuẩn IE8, bất kể !DOCTYPEchỉ thị nào.

  • 8000 (0x1F40) - Các trang web chứa !DOCTYPE chỉ thị dựa trên tiêu chuẩn được hiển thị ở chế độ IE8.

  • 7000 (0x1B58) - Các trang web chứa các !DOCTYPE chỉ thị dựa trên tiêu chuẩn được hiển thị ở chế độ Tiêu chuẩn IE7.

Tham khảo: MSDN: Internet Feature Controls

Tôi thấy các ứng dụng như Skype sử dụng 10001. Tôi không biết.

GHI CHÚ

Ứng dụng thiết lập sẽ thay đổi sổ đăng ký. Bạn có thể cần thêm một dòng trong Tệp kê khai để tránh lỗi do quyền thay đổi trong sổ đăng ký:

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

CẬP NHẬT 1

Đây là lớp sẽ nhận được phiên bản IE mới nhất trên windows và thực hiện các thay đổi cần thiết;

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ử dụng lớp như sau

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

bạn có thể gặp phải vấn đề về khả năng so sánh của windows 10, có thể do chính trang web của bạn, bạn có thể cần thêm thẻ meta này

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

Thưởng thức :)


2
Từ MSDN: "Trình chuyển hướng sổ đăng ký cô lập các ứng dụng 32 bit và 64 bit bằng cách cung cấp các chế độ xem lôgic riêng biệt của các phần nhất định của sổ đăng ký trên WOW64. Trình chuyển hướng đăng ký chặn các cuộc gọi đăng ký 32 bit và 64 bit đến các chế độ xem đăng ký lôgic tương ứng của chúng và ánh xạ chúng tới vị trí đăng ký vật lý tương ứng. Quá trình chuyển hướng là minh bạch đối với ứng dụng. Do đó, ứng dụng 32 bit có thể truy cập dữ liệu đăng ký như thể nó đang chạy trên Windows 32 bit ngay cả khi dữ liệu được lưu trữ ở một vị trí khác trên Windows 64-bit" Bạn không cần phải lo lắng về Wow6432Node
Luca Manzo

2
Bạn cũng có thể sử dụng HKEY_CURRENT_USER, không cần quản trị viên.
Michael Chourdakis

4
Một gợi ý: Thay đổi Environment.Is64BitOperatingSystemthành Environment.Is64BitProcess.
CC Inc

1
@JobaDiniz vui lòng kiểm tra CẬP NHẬT 1 sẽ giúp bạn :)
Mhmd

4
Tôi biết đây là một vài năm tuổi, nhưng đối với những độc giả trong tương lai: Ứng dụng của bạn không cần phải kiểm tra xem nó đang chạy trong hệ thống 64 bit hay thậm chí trong quy trình 64 bit. Phiên bản Windows 64 bit đã triển khai Registry Redirector sẽ tự động chuyển hướng các ứng dụng 32 bit chạy trên hệ thống 64 bit đến Wow6432Nodekhóa con. Ứng dụng của bạn không cần phải làm gì thêm để thích ứng với khóa 'mới' này.
Visual Vincent

60

Sử dụng các giá trị từ 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
Anh bạn, đó là cách dễ dàng hơn để có được phiên bản ... Cảm ơn, cách này phù hợp với tôi!
sfaust

Cảm ơn, ngoại trừ mã đẹp CreateSubKeynên được sử dụng thay OpenSubKeyvì OpenSubKey sẽ trả về null nếu khóa không tồn tại.
eug,

Điểm tuyệt vời! Tôi đã chỉnh sửa câu trả lời để sử dụng CreateSubKey và chỉ đặt giá trị khi nó chưa được đặt.
RooiWillie

Tuyệt vời! Cảm ơn bạn rất nhiều. Điều này nên được trả lời tốt nhất. Đã thử giải pháp quái vật ở trên nhưng không có sự khác biệt. Điều này tiếp cận đã đóng đinh nó. Cảm ơn một lần nữa!
Matt

1
@MarkNS Vâng, trong trường hợp đó, bạn có thể thực hiện kiểm tra null và sau đó kiểm tra phiên bản trước khi viết nó. Logic đằng sau đó chỉ đơn giản là để tránh việc ghi liên tục vào sổ đăng ký, nhưng nếu bạn đồng ý với điều đó, bạn có thể chỉ cần loại bỏ kiểm tra null.
RooiWillie

18
var appName = System.Diagnostics.Process.GetCurrentProcess().ProcessName + ".exe";

using (var Key = Registry.CurrentUser.OpenSubKey(@"SOFTWARE\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_BROWSER_EMULATION", true))
    Key.SetValue(appName, 99999, RegistryValueKind.DWord);

Theo những gì tôi đọc ở đây ( Kiểm soát khả năng tương thích của WebBrowser Control :

Điều gì xảy ra nếu tôi đặt giá trị chế độ tài liệu FEATURE_BROWSER_EMULATION cao hơn phiên bản IE trên máy khách?

Rõ ràng, điều khiển trình duyệt chỉ có thể hỗ trợ chế độ tài liệu nhỏ hơn hoặc bằng phiên bản IE được cài đặt trên máy khách. Sử dụng khóa FEATURE_BROWSER_EMULATION hoạt động tốt nhất cho dòng ứng dụng doanh nghiệp dành cho doanh nghiệp có phiên bản được triển khai và hỗ trợ của trình duyệt. Trong trường hợp bạn đặt giá trị cho chế độ trình duyệt là phiên bản cao hơn phiên bản trình duyệt được cài đặt trên máy khách, bộ điều khiển trình duyệt sẽ chọn chế độ tài liệu cao nhất hiện có.

Điều đơn giản nhất là đặt một số thập phân rất cao ...


Lưu ý: nếu bạn đang chạy ứng dụng 32bit trên win64, bạn cần chỉnh sửa khóa SOFTWARE\WOW6432Node\Microsoft.... Nó được tự động chuyển hướng trong mã, nhưng có thể khiến bạn ngạc nhiên nếu bạn mở regedit.
toster-cx

1
ngắn 'n ngọt ngào. Đối với tôi Registry.LocalMachine.OpenSubKey(".. đã làm việc trên máy chủ Win2012 với tư cách là quản trị viên.
bendecko

@bendecko, vì ứng dụng của bạn cần có đặc quyền của quản trị viên.
dovid

/! \ không sử dụng giải pháp này /! \ coz nó sẽ dự phòng trên IE7 nếu bạn sử dụng điều hướng (tới tệp cục bộ) và nội dung HTML của bạn nằm trong vùng Intranet (ví dụ: sử dụng MOTW cho máy chủ cục bộ). Sử dụng 99999 sẽ có cùng hành vi so với sử dụng 11000. Trong khi để giải quyết vấn đề mà tôi đã đề cập ở trên, bạn sẽ cần 11001.
Lenor

12

Bạn có thể thử liên kết này

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

Tốt, tôi chỉ muốn đăng ký trong sổ đăng ký HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Internet Explorernhưng cách này đơn giản hơn. cảm ơn
Moslem7026

5
Processes.getCurrentProcessName()gì? Có thể được Process.GetCurrentProcess().ProcessName?
SerG

1
LocalMachine.getOrCreateSubKey là gì? Không tồn tại?
TEK

2
Bạn cũng có thể sử dụng HKEY_CURRENT_USER, không cần quản trị viên.
Michael Chourdakis

12

Thay vì thay đổi RegKey, tôi có thể đặt một dòng trong tiêu đề HTML của mình:

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

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

Xem Kiểm soát & Chỉ định Trình duyệt Web .


Mặc dù kỹ thuật này hoạt động, nhưng nó không cung cấp cùng một Tác nhân người dùng. Với FEATURE_BROWSER_EMULATIONkỹ thuật, tôi nhận được Mozilla/5.0 (Windows NT 6.2; Win64; x64; ...Trong khi với X-UA-Compatiblekỹ thuật, tôi nhận được Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.2; ..., mà Google Analytics phát hiện là một Điện thoại di động.
Benoit Blanchon

Cảm ơn bạn! Hoạt động hoàn toàn tốt khi tất cả những gì bạn cần là lưu trữ một trang cục bộ (vì vậy chuỗi tác nhân người dùng hoàn toàn không liên quan).
realMarkusSchmidt

4

Đây là phương pháp mà tôi thường sử dụng và phù hợp với tôi (cho cả ứng dụng 32 bit và 64 bit; tức là bất kỳ ai có thể được ghi lại ở đây: Internet Feature Controls (B..C), Trình duyệt mô phỏng ):

    [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

Tôi đã có thể triển khai giải pháp của Luca, nhưng tôi phải thực hiện một vài thay đổi để nó hoạt động. Mục tiêu của tôi là sử dụng D3.js với điều khiển Trình duyệt Web cho Ứng dụng Windows Forms (nhắm mục tiêu .NET 2.0). Nó đang làm việc cho tôi bây giờ. Tôi hy vọng điều này có thể giúp ai đó khác.

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

Ngoài ra, tôi đã thêm một chuỗi (tức là_emulation) vào cài đặt của dự án với giá trị là 11999. Giá trị này dường như đang hoạt động cho IE11 (11.0.15).

Tiếp theo, tôi phải thay đổi quyền cho ứng dụng của mình để cho phép truy cập vào sổ đăng ký. Điều này có thể được thực hiện bằng cách thêm một mục mới vào dự án của bạn (sử dụng VS2012). Trong Mục Chung, hãy chọn Tệp kê khai Ứng dụng. Thay đổi cấp độ từ asInvoker thành requestAdministrator (như hình bên dưới).

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

Nếu ai đó đang đọc bài này đang cố gắng sử dụng D3.js với điều khiển trình duyệt web, bạn có thể phải sửa đổi dữ liệu JSON được lưu trữ trong một biến bên trong trang HTML của bạn vì D3.json sử dụng XmlHttpRequest (dễ sử dụng hơn với máy chủ web). Sau những thay đổi đó và những điều trên, biểu mẫu windows của tôi có thể tải các tệp HTML cục bộ gọi D3.


2

Kết hợp các câu trả lời của RooiWillie và MohD
và nhớ chạy ứng dụng của bạn với quyền quản trị.

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
như mọi người đã chỉ ra trước đó, việc sử dụng khóa đăng ký localmachine hạn chế cài đặt ứng dụng của quản trị viên trong khi khóa người dùng hiện tại cho phép người dùng thông thường cài đặt ứng dụng. cái sau linh hoạt hơn
gg89

1

chỉ cần thêm phần sau vào html của bạn thì không cần đến registry settigns

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

làm cách nào để thêm thẻ meta head vào WebBrowser? Tôi không thể thêm registry vì ứng dụng của tôi sẽ được chạy trên tài khoản người dùng như vỏ mặc định (như trình duyệt web ứng dụng độc lập)
Luiey

0

Phiên bản 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

Tôi biết điều này đã được đăng nhưng đây là phiên bản hiện tại cho dotnet 4.5 ở trên mà tôi sử dụng. Tôi khuyên bạn nên sử dụng trình mô phỏng trình duyệt mặc định tôn trọng loại tài liệu

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
Làm gì với nó? .. Làm thế nào để sử dụng nó? Gọi cái gì và khi nào?
Kosmos

Bạn gọi nó trong bữa ăn trưa đầu tiên của mã nếu bạn muốn. Để sử dụng codeInternetExplorerFeatureControl.Instance.BrowserEmulation = DocumentMode.DefaultRespectDocType; ' Để hiểu rõ hơn nơi này được kéo bạn có thể nhìn vào msdn.microsoft.com/en-us/ie/...
Justin Davis

Cũng cần thêm lưu ý, cái này không yêu cầu quyền quản trị viên để bật. Nó cũng sẽ chọn sổ đăng ký chính xác dựa trên bitness và đặt các hạn chế tương tự như tài liệu hướng dẫn. Chẳng hạn như kết xuất GPU cần IE 9 để hoạt động
Justin Davis

0

Một giải pháp rẻ và dễ dàng cho nó là bạn chỉ có thể đặt một giá trị lớn hơn 11001 vào khóa FEATURE_BROWSER_EMULATION. Sau đó, phải sử dụng IE mới nhất có sẵn trong hệ thống.


0

Tốt nhất bạn nên ép chế độ cao nhất có thể. Điều đó có thể được thực hiện bằng cách thêm:

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

và luôn luôn tốt nếu bao gồm thư viện polyfill để hỗ trợ IE:

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

trước bất kỳ tập lệnh nào.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.