1. ホーム
  2. c#

[解決済み] ウェブブラウザコントロールで最新版のInternet Explorerを使用する

2023-02-22 20:09:20

質問

C#のウェブブラウザコントロールのデフォルトバージョンは Windows フォーム アプリケーションのデフォルトは 7 ですが、記事によって 9 に変更しました。 ブラウザのエミュレーション とあるが、インストールされているInternet Explorerの最新版をWebbrowserコントロールで使用するのはどうなんだろう?

どのように解決するのですか?

私は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) - インターネットエクスプローラー11。ウェブページがIE11のエッジモードで表示される のエッジモードに関係なく表示されます。 !DOCTYPE ディレクティブに関係なく、IE11 のエッジモードで表示されます。

  • 11000 (0x2AF8) - インターネットエクスプローラー 11。を含むウェブページは 標準ベース !DOCTYPE ディレクティブを含むウェブページが、IE11 のエッジモードで表示されるようになりました。 IE11のデフォルト値です。

  • 10001 (0x2711) - インターネットエクスプローラー10で Web ページが IE10 標準モードで表示されます。 モードで表示されます。 !DOCTYPE ディレクティブに関係なく、IE10 の標準モードで表示されます。

  • 10000 (0x2710) - インターネット エクスプローラー 10。標準ベースの !DOCTYPE ディレクティブを含むウェブページは、IE10 の標準モードで表示されます。デフォルト Internet Explorer 10 の値です。

  • 9999 (0x270F) - インターネットエクスプローラー9。ウェブページはIE9の 標準モードで表示されます。 !DOCTYPE ディレクティブに関係なく、IE9 の標準モードで表示されます。

  • 9000 (0x2328) - インターネットエクスプローラ 9。を含むウェブページは 標準ベース !DOCTYPE ディレクティブを含むウェブページは、IE9 モードで表示されます。

  • 8888 (0x22B8) - IE8の標準モードでWebページが表示される。 に関係なく !DOCTYPE ディレクティブに関係なく、IE8 の標準モードで表示されます。

  • 8000 (0x1F40) - 標準規格を含むウェブページ !DOCTYPE ディレクティブを含む Web ページは IE8 モードで表示されます。

  • 7000 (0x1B58) - 標準規格を含むウェブページ !DOCTYPE ディレクティブを含む Web ページは、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);

Windows10との比較で問題になるのは、あなたのウェブサイトが原因かもしれません。 このmetaタグを追加する必要があるかもしれません。

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

お楽しみに :)