久しぶりに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 で登録してあげると宜しいかと。
コメント
FEATURE_DOCUMENT_COMPATIBLE_MODE
でレンダリングの挙動が変わったことってどうやって確認されましたか?
@匿名 さま
コメントありがとうございます。
挙動の確認ですが、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までですが)
ソース行の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 なんでは?
GSX-R750 さま
コメントありがとうございます。
ご指摘の件ですが手元の環境(Windows7)で試したところ、どちらでも反映されるようです。
レジストリの仕様としては
・HKEY_CURRENT_USER => 現在のユーザー
・HKEY_LOCAL_MACHINE => 現在のPC(すべてのユーザー)
となっており、両方に設定されているような場合にはHKEY_CURRENT_USERの方が優先されるはずだったかと思います。
了解しました。
わざわざ、返答ありがとうございました。
不勉強を恥じ入るばかりです。
GSX-R750 さま
私がお答えできる内容であれば全然問題ありませんのでお気になさらずに(^ ^)