WebBrowserコントロールのIEバージョン

.NETアプリでWebBroserコントロールを貼っつけたらInternet Explorerコンポーネントが貼り付けられます。
ところで、このIEコンポーネント、どんなIEなんでしょうか。

「そんなんマシンに入ってるIEと同じに決まってんやろ」という人は鴨川デルタで磔にされますよ。



f:id:W53SA:20131216203756j:plain

WebBroswerコントロールで動くIEはバージョン7です。

ほんまかいな、という人のためにAcid2テスト*1をしてみましょう。

f:id:W53SA:20131216204027j:plain

見事に失敗してますね。

In order to ensure that these existing applications remain in working order, IE8 renders pages running within instances of the WebBrowser control in IE7 Standards Mode by default.


WebBrowser Control Rendering Modes in IE8 - IEBlog - Site Home - MSDN Blogs

既存のアプリケーションが困らないようにこうしたんだって。

WebBroswerコントロールでIE7以外を使うには

それはそれとして、IE11が入ってるマシンでIE7レンダリングなんかしてるとW3C原理主義者に血祭りにあげられてしまいます。

血祭りにならないためにはどうすればいいか。

レンダリングするhtml内metaタグでX-UA-Compatibleに要求するIEバージョン書く手段もあります*2が、今回はUA側の話をします。
cf. ドキュメント互換性の定義 META タグと将来の互換性のロック



レジストリをいじって、EXEファイル名毎にIEバージョンの指定ができます。

要するに

  1. HKEY_CURRENT_USER\SOFTWARE\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_BROWSER_EMULATIONに設定開く
  2. プログラムファイル名を名前に持つDWORDキーを作って要求するIEバージョンの数字入れる

f:id:W53SA:20131220113854j:plain

ということで。IEはDOCTYPE有無によって描画時の挙動が変わりますが、それも制御出来る様子。

いじくるレジストリはHKCU*3だけでなくHKLM*4でもいいんですが、HKLMだとWOW64仮想化がかかるしUACアクセス制御食らうので、HKCUのほうがいいんじゃないでしょうか。










しかし、なんでプログラムファイル名やねん感があふれる。IWebBrowserで制御したいよー。



ちなみにInternet Explorerはv9からGPU支援が実装されましたが、これもレジストリに書かないと有効になりません。


IE9以降が入ってるマシンで、レジストリにIE8あたりを設定してGPUレンダリング有効にしてFishIETank走らせると、GPU使用率が揺れるのでどうもGPU使ってるように見えますが確証なし。

(おまけ)FlashGPU支援

IE11(11.0.9600.16475)+Flash(11.9.900.170) / Win6.1.7601 ではこのレジストリの設定によらずGPUを使うようです。昔はレジストリいじらないとGPU使ってくれなかったような気がしたんですけど、

IE8+FlashではGPU使ってないっぽいけどIE1+Flash(11.9.900.170)だとGPU使ったんで、FlashPlayerが進化したのかな。

*1:Acid2IE7不合格でIE8は合格してる。

*2:レジストリに書かれたIEバージョンより新しいバージョンは指定してもスルーされるような気もするんですけど試してもよくわからない。

*3:HKEY_CURRENT_USER

*4:HKEY_LOCAL_MACHINE