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

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 で登録してあげると宜しいかと。

関連する投稿

カテゴリー: C# タグ: ,
  1. コメントはまだありません。
  1. トラックバックはまだありません。

Powered by WP Hashcash