웹 브라우저 컨트롤에서 최신 버전의 Internet Explorer 사용


답변:


99

나는 Veer의 대답을 보았다. 나는 그것이 옳다고 생각하지만 그것은 나를 위해 일하지 않았습니다. 아마도 .NET 4를 사용하고 있으며 64x OS를 사용하고 있으므로 친절하게 확인하십시오.

애플리케이션을 시작할 때 설정하거나 확인할 수 있습니다.

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. 웹 페이지가 !DOCTYPE지시문에 관계없이 IE11 에지 모드로 표시됩니다 .

  • 11000 (0x2AF8)-Internet Explorer 11. 표준 기반 !DOCTYPE지시문이 포함 된 웹 페이지가 IE11 에지 모드로 표시됩니다. IE11의 기본값입니다.

  • 10001 (0x2711)-Internet Explorer 10. 웹 페이지는 !DOCTYPE지시문에 관계없이 IE10 표준 모드로 표시됩니다 .

  • 10000 (0x2710)-Internet Explorer 10. 표준 기반 !DOCTYPE지시문이 포함 된 웹 페이지가 IE10 표준 모드로 표시됩니다. Internet Explorer 10의 기본값입니다.

  • 9999 (0x270F) -Internet Explorer 9. 웹 페이지는 !DOCTYPE지시문에 관계없이 IE9 표준 모드로 표시됩니다 .

  • 9000 (0x2328)-Internet Explorer 9. 표준 기반 !DOCTYPE지시문이 포함 된 웹 페이지가 IE9 모드로 표시됩니다.

  • 8888 (0x22B8) - !DOCTYPE지시문에 관계없이 웹 페이지가 IE8 표준 모드로 표시됩니다 .

  • 8000 (0x1F40) -표준 기반 !DOCTYPE 지시문이 포함 된 웹 페이지가 IE8 모드로 표시됩니다.

  • 7000 (0x1B58) -표준 기반 !DOCTYPE 지시문이 포함 된 웹 페이지가 IE7 표준 모드로 표시됩니다.

참조 : MSDN : 인터넷 기능 컨트롤

Skype와 같은 응용 프로그램이 10001을 사용하는 것을 봤습니다. 모르겠습니다.

노트

설치 응용 프로그램이 레지스트리를 변경합니다. 레지스트리 변경 권한으로 인한 오류를 방지하려면 매니페스트 파일에 줄을 추가해야 할 수 있습니다.

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

업데이트 1

이 클래스는 Windows에서 최신 버전의 IE를 가져와야하는대로 변경합니다.

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에서 : "레지스트리 리디렉터는 WOW64에서 레지스트리의 특정 부분에 대한 별도의 논리적보기를 제공하여 32 비트 및 64 비트 응용 프로그램을 분리합니다. 레지스트리 리디렉터는 각각의 논리적 레지스트리보기에 대한 32 비트 및 64 비트 레지스트리 호출을 가로 챕니다. 해당 물리적 ​​레지스트리 위치에 매핑합니다. 리디렉션 프로세스는 응용 프로그램에 투명합니다. 따라서 32 비트 응용 프로그램은 데이터가 다른 위치에 저장되어 있어도 32 비트 Windows에서 실행중인 것처럼 레지스트리 데이터에 액세스 할 수 있습니다. 당신은 Wow6432Node에 대해 걱정할 필요가 없습니다 "윈도우 64 비트
루카 MANZO

2
HKEY_CURRENT_USER도 사용할 수 있으며 관리자는 필요하지 않습니다.
Michael Chourdakis

4
한 가지 제안 : 변경 Environment.Is64BitOperatingSystemEnvironment.Is64BitProcess.
CC Inc

1
@JobaDiniz 친절하게 업데이트 1이 당신을 도울 것입니다 :)
Mhmd

4
나는 이것이 몇 년 전이라는 것을 알고 있지만 미래의 독자를 위해 : 애플리케이션이 64 비트 시스템에서 실행 중인지 아니면 64 비트 프로세스에서 실행 중인지 확인할 필요가 없습니다. 64 비트 버전의 Windows 는 64 비트 시스템에서 실행되는 32 비트 앱을 하위 키로 자동 리디렉션 하는 Registry Redirector 를 구현했습니다 Wow6432Node. 애플리케이션은이 '새'키에 적응하기 위해 추가 작업을 할 필요가 없습니다.
Visual Vincent

60

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

감사 합니다. 키가 없으면 OpenSubKey가 null을 반환하기 때문에 CreateSubKey대신 사용해야한다는 점을 제외하고 멋진 코드 OpenSubKey가 있습니다.
EUG

그레이트 포인트! CreateSubKey를 사용하고 설정되지 않은 경우에만 값을 설정하도록 답변을 편집했습니다.
RooiWillie 2017 년

대박! 정말 고맙습니다. 이것은 최고의 답변이어야합니다. 위의 몬스터 솔루션을 시도했지만 차이는 없습니다. 이것은 그것을 못 박았다. 다시 한 번 감사드립니다!
Matt

1
@MarkNS 글쎄,이 경우 널 검사를 한 다음 작성하기 전에 버전 검사를 할 수 있습니다. 그 뒤에있는 논리는 단순히 레지스트리에 대한 지속적인 쓰기를 피하는 것이지만, 괜찮다면 단순히 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);

내가 여기서 읽은 내용에 따르면 ( WebBrowser 컨트롤 호환성 제어 :

클라이언트에서 FEATURE_BROWSER_EMULATION 문서 모드 값을 IE 버전보다 높게 설정하면 어떻게됩니까?

분명히 브라우저 컨트롤은 클라이언트에 설치된 IE 버전보다 작거나 같은 문서 모드 만 지원할 수 있습니다. FEATURE_BROWSER_EMULATION 키를 사용하면 브라우저의 배포 및 지원 버전이있는 엔터프라이즈 LOB (기간 업무) 앱에 가장 적합합니다. 클라이언트에 설치된 브라우저 버전보다 높은 버전의 브라우저 모드로 값을 설정하면 브라우저 컨트롤이 사용 가능한 가장 높은 문서 모드를 선택합니다.

가장 간단한 것은 매우 높은 십진수를 넣는 것입니다 ...


참고 : win64에서 32 비트 앱을 실행하는 경우 편집이 필요한 키는 SOFTWARE\WOW6432Node\Microsoft.... 코드에서 자동으로 리디렉션되지만 regedit를 열면 놀라게 될 수 있습니다.
toster-cx

1
짧고 달콤합니다. 나를 Registry.LocalMachine.OpenSubKey(".. 위해 Win2012 서버에서 관리자로 일했습니다.
bendecko

@bendecko, 응용 프로그램에 관리자 권한이 필요합니다.
dovid

/! \이 솔루션을 사용하지 마십시오. /! \ 네비 게이트 (로컬 파일로)를 사용하고 HTML 콘텐츠가 인트라넷 영역에있는 경우 (예 : 로컬 호스트에 대한 MOTW 사용) IE7에서 폴백됩니다. 99999를 사용하는 것은 11000을 사용하는 것과 동일한 동작을합니다. 위에서 언급 한 문제를 해결하려면 11001이 필요합니다.
Lenor

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

string ver = (new WebBrowser ()). Version.ToString ();
Veer

좋아요, 레지스트리를 체크인하고 싶었지만 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Internet Explorer이 방법이 더 간단합니다. 감사
Moslem7026

5
무엇입니까 Processes.getCurrentProcessName()? 될 수 Process.GetCurrentProcess().ProcessName있습니까?
SerG 2014

1
localMachine.getOrCreateSubKey는 무엇입니까? 존재하지 않는다?
TEK

2
HKEY_CURRENT_USER도 사용할 수 있으며 관리자는 필요하지 않습니다.
Michael Chourdakis

12

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 버전 지정을 참조하십시오 .


이 기술은 작동하지만 동일한 사용자 에이전트를 제공하지는 않습니다. 으로 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 웹 로그 분석은 모바일로 감지합니다.
Benoit Blanchon

감사합니다! 필요한 모든 것이 로컬 페이지를 호스팅하는 것이라면 완벽하게 작동합니다 (따라서 사용자 에이전트 문자열은 전혀 관련이 없습니다).
realMarkusSchmidt

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의 솔루션을 구현할 수 있었지만 작동하려면 몇 가지 사항을 변경해야했습니다. 내 목표는 Windows Forms 응용 프로그램 (.NET 2.0을 대상으로 함) 용 웹 브라우저 컨트롤과 함께 D3.js를 사용하는 것이 었습니다. 그것은 지금 나를 위해 일하고 있습니다. 이것이 다른 사람을 도울 수 있기를 바랍니다.

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

또한 프로젝트 설정에 11999 값으로 문자열 (ie_emulation)을 추가했습니다.이 값은 IE11 (11.0.15)에서 작동하는 것 같습니다.

다음으로, 레지스트리에 대한 액세스를 허용하기 위해 애플리케이션의 권한을 변경해야했습니다. 프로젝트에 새 항목을 추가하면됩니다 (VS2012 사용). 일반 항목에서 응용 프로그램 매니페스트 파일을 선택합니다. asInvoker에서 requireAdministrator로 레벨을 변경하십시오 (아래 참조).

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

이 글을 읽는 누군가가 웹 브라우저 컨트롤과 함께 D3.js를 사용하려는 경우, D3.json이 XmlHttpRequest를 사용하기 때문에 HTML 페이지 내의 변수 내에 저장되도록 JSON 데이터를 수정해야 할 수 있습니다 (웹 서버에서 사용하기 쉬움). 이러한 변경 사항과 위의 사항 후에 내 Windows 양식은 D3를 호출하는 로컬 HTML 파일을로드 할 수 있습니다.


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" >

WebBrowser에 헤드 메타 태그를 추가하는 방법은 무엇입니까? 내 응용 프로그램 (독립 실행 형 응용 프로그램 웹 브라우저로) 기본 쉘과 같은 사용자 계정에서 실행되기 때문에 나는 레지스트리를 추가 할 수 없습니다
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의 현재 버전이 있습니다. 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
}

1
어떻게해야하나요? .. 어떻게 사용하나요? 무엇을 언제 전화해야합니까?
Kosmos

원하는 경우 첫 번째 코드 점심 때 호출합니다. codeInternetExplorerFeatureControl.Instance.BrowserEmulation = DocumentMode.DefaultRespectDocType; ' 을 사용하려면 이것이 어디에서 추출되었는지 더 잘 이해하려면 msdn.microsoft.com/en-us/ie/…
Justin Davis

또한 메모를 추가하기 위해이 기능을 사용하려면 관리자 권한이 필요하지 않습니다. 또한 비트를 기반으로 올바른 레지스트리를 선택하고 문서에 표시된 것과 동일한 제한을 설정합니다. 작동하려면 IE 9가 필요한 GPU 렌더링 등
Justin Davis

0

이에 대한 저렴하고 쉬운 해결 방법은 FEATURE_BROWSER_EMULATION 키에 11001보다 큰 값을 입력 할 수 있다는 것입니다. 그런 다음 시스템에서 사용할 수있는 최신 IE를 사용합니다.


0

가능한 가장 높은 모드를 사용하는 것이 가장 좋습니다. 다음을 추가하여 수행 할 수 있습니다.

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

IE를 지원하려면 항상 polyfill 라이브러리를 포함하는 것이 좋습니다.

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

스크립트 앞에.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.