C# WebBrowserとIE8レンダリングモード

久しぶりにC#で遊んでいて、たまたまWebBrowserコントロールでUserAgentを表示したときの出来事。

useragent

あれ?IE7?

ウチのInternetExporerは8にバージョンアップしてる筈なのに・・・
(というかIE6⇒IE8だったのでIE7そのものをインストしていない。)

早速ググってみたところ、もともとIE8には3つのモードがある模様。

  • Quirksモード(互換モード)
  • IE7 Standardsモード(IE7標準準拠モード)
  • IE8 Standardsモード(IE8標準準拠モード)

Webページの場合はDOCTYPE 宣言などでイロイロ切り替わるらしい。
この値はJavaScriptのdocument.documentModeで取得できる。
値は以下の通り。

  • 5 (Quirksモード)
  • 7 (IE7 Standardsモード)
  • 8 (IE8 Standardsモード)

じゃあWebBrowserコントロールはどのモードになってるの?
っつーことで早速表示させてみる。

renderingmode0

「5(Quirksモード)」って・・・・orz

挫けず更にググってみると・・・・
なるほど、レジストリの値をいぢる必要があるのか!

でもイロイロな情報があるんだけど、どれも微妙に違っててどれが本当なのかいまいちわかん(^ ^;

一応自分の環境では以下の通り確認しました。
(WindowsXP SP3 + InternetExplorer8 + VisualC# 2008 Express SP1 + .NET Framework3.5 SP1)

◎レンダリングモードの切替

キー:
HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_DOCUMENT_COMPATIBLE_MODE

名前:
EXEファイル名

値: DWORD型で10進数表記。

  • 50000 (Quirksモード)
  • 70000 (IE7 Standardsモード)
  • 80000 (IE8 Standardsモード)

◎ユーザーエージェントの切替

キー:
HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_BROWSER_EMULATION

名前:
EXEファイル名

値: DWORD型で10進数表記。

  • 8000 (IE8)
  • 8000以外 (IE7)

◎結果

renderingmode1renderingmode2

これでモードも自由自在w

これ以外にも、

キー:
HKEY_LOCAL_MACHINE\Software\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_NATIVE_DOCUMENT_MODE

をいぢるという記事を見かけたのですが、残念ながら自分の環境では動作を確認できませんでした。。。

以下、C#のコード上でユーザーエージェント、レンダリングモードともにIE8にする場合の例です。
(EXE名は WebBrowserTest.exe)

    string FEATURE_BROWSER_EMULATION = @"Software\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_BROWSER_EMULATION";
    string FEATURE_DOCUMENT_COMPATIBLE_MODE = @"Software\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_DOCUMENT_COMPATIBLE_MODE";
    string exename = "WebBrowserTest.exe";
    using (RegistryKey regkey1 = Registry.CurrentUser.CreateSubKey(FEATURE_BROWSER_EMULATION))
    using (RegistryKey regkey2 = Registry.CurrentUser.CreateSubKey(FEATURE_DOCUMENT_COMPATIBLE_MODE))
    {
        regkey1.SetValue(exename, 8000, RegistryValueKind.DWord);
        regkey2.SetValue(exename, 80000, RegistryValueKind.DWord);
        regkey1.Close();
        regkey2.Close();
    }

ちなみに、デバックの際はEXE名がvshost経由で判断されるようなのでプリプロセッサで誤魔化すとかw

#if DEBUG
    string exename = "WebBrowserTest.vshost.exe";
#else
    string exename = "WebBrowserTest.exe";
#endif

最後に、レジストリの設定は C# (正しくは.NET!?) のWebBrowserコントロールに限らず、
IEのレンダリングエンジンを使用した他のアプリケーションでも同様です。

EXEファイル名を、 Sleipnir なら sleipnir.exe 、 FirefoxでIETabアドオンなら firefox.exe で登録してあげると宜しいかと。

スポンサーリンク

シェアする

  • このエントリーをはてなブックマークに追加

フォローする

スポンサーリンク

コメント

  1. 匿名 より:

    FEATURE_DOCUMENT_COMPATIBLE_MODE
    でレンダリングの挙動が変わったことってどうやって確認されましたか?

  2. ぬっき~ より:

    @匿名 さま

    コメントありがとうございます。

    挙動の確認ですが、CSSの対応状況がバージョンによって異なることを利用しました。
    次のサイトが参考になると思います。

    http://builder.japan.zdnet.com/html-css/sp_internet-explorer-8-2009/20391111/

    上記ページの「※ブラウザで表示を確認する」のURL

    http://builder.japan.zdnet.com/story_media/20391111/samp01.html

    を、c#のWebBrowserで表示させることで確認できると思います。(IE8までですが)

  3. GSX-R750 より:

    ソース行の4・5行目
    using (RegistryKey regkey1 = Registry.CurrentUser.CreateSubKey(FEATURE_BROWSER_EMULATION))
    using (RegistryKey regkey2 = Registry.CurrentUser.CreateSubKey(FEATURE_DOCUMENT_COMPATIBLE_MODE))

    Registry.CurrentUser ではなく、Registry.LocalMachine なんでは?

  4. ぬっき~ より:

    GSX-R750 さま

    コメントありがとうございます。

    ご指摘の件ですが手元の環境(Windows7)で試したところ、どちらでも反映されるようです。

    レジストリの仕様としては

    ・HKEY_CURRENT_USER => 現在のユーザー
    ・HKEY_LOCAL_MACHINE => 現在のPC(すべてのユーザー)

    となっており、両方に設定されているような場合にはHKEY_CURRENT_USERの方が優先されるはずだったかと思います。

  5. GSX-R750 より:

    了解しました。
    わざわざ、返答ありがとうございました。
    不勉強を恥じ入るばかりです。

  6. ぬっき~ より:

    GSX-R750 さま

    私がお答えできる内容であれば全然問題ありませんのでお気になさらずに(^ ^)