C# WebBrowserとIE8レンダリングモード
久しぶりにC#で遊んでいて、たまたまWebBrowserコントロールで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コントロールはどのモードになってるの?
っつーことで早速表示させてみる。
「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)
◎結果
これでモードも自由自在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 で登録してあげると宜しいかと。




最近のコメント