kkamegawa's weblog

Visual Studio,TFS,ALM,VSTS,DevOps関係のことについていろいろと書いていきます。Google Analyticsで解析を行っています

Windows 8のWebBrowserControlをタッチ対応にする

WPFやWindows FormにはWebBrowoser Controlがあります。Windows 8のIE11でも既定では入力はレガシーモードで動いています。どんなことがレガシーかといえばこんな点。

Internet Feature Controls (I..L) (Internet Explorer)より引用

  • Windows pointer messages are not processed by the Trident rendering engine (mshtml.dll).
  • Document Object Model (DOM) pointer and gesture events do not fire.
  • Mouse and touch messages are dispatched according to the Windows 7 input model.
  • Touch selection follows the Windows 7 model ("drag to select") instead of the Windows 8 model ("tap to select").
  • Hardware accelerated panning and zooming is disabled.
  • The Zoom and Pan Cascading Style Sheets (CSS) properties are ignored.

要は表示するだけならいいんですが、タッチ対応の機能がことごとく無効になります。これを回避するにはリンク中にあるレジストリHKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_NINPUT_LEGACYMODE(HKEY_CURRENT_USERでも可)に対象のプロセス名を書いて、REG_DWORDに0を指定すればいいです。

このレジストリを設定すると対象プロセスのWebBrowserControlではタッチが期待通り機能します。具体的には画像を選んでもドラッグドロップ操作になることはありません。

ところがWindows 8のIE11ではこれ副作用があって、ダブルタップでズームインが元に戻りません(Windows 7では戻るらしいので、おそらくバグ)。IWebBrowser2::ExecWBでズーム倍率を明示的に指定してもだめです。

https://connect.microsoft.com/IE/feedback/details/867621/

OLECMDID_OPTICAL_ZOOM is not updated when pinch-to-zoom is performed on Win 8.1 and IE 11

世界中で困っている人がいるようで、どうしてもこのFEATURE_NINPUT_LEGACYMODEを有効にした状態でズームアウトしたいようです。で、いろいろできないか調べたら(Magnification APIで外から拡大縮小コントロールするとか…)、足元にありました(笑)。

Internet Feature Controls (U..Y) (Internet Explorer)

同じようにFEATURE_WEBOC_DOCUMENT_ZOOMを設定したら該当プロセスでダブルタップするとちゃんとズームアウトするようになりました。あと、Visual Studioでデバッグするときはちゃんとホストプロセスを無効にしてからやってください。ちゃんと動くと思ってしまいますんで。

方法 : ホスト プロセスを無効にする