
C#のWindowsフォームにて、WebBrowserコントロールを使って、簡易ブラウザを作った時の話。
IEの拡大、縮小機能を独自ボタンで実装しようと思ったら、Zoom値の取得で結構ハマりました。
もともとは、Zoom値の初期値を100%として内部保持し、拡大ボタンで+10%、縮小ボタンで-10%としていました。
でもこれだと、タブレットでピンチイン・ピンチアウトをしたら値を反映できないんですよね。
ということで、Zoom値の取得は必須で、
- Zoom値を取得
- 拡大なら加算、縮小なら減算
- Zoom値を設定
という手順が必要になりました。
事前準備
では早速いきたいところですが、まずは事前準備が必要です。
スポンサーリンク
今回は、VisualStudio2013で使って説明するので、別バージョンを使っている場合は、少し方法が異なるかもしれません。
参照を追加
まずは、以下の2つの参照を追加します。
- Microsoft.mshtml
- Interop.SHDocVw (Microsoft Internet Controls)
Microsoft.mshtml
ソリューションエクスプローラの参照設定を右クリックし、「参照の追加」を選択します。
左側で「アセンブリ」を選択した状態で、右上の検索窓に、「mshtml」を入力します。
すると、真ん中の一覧に「Microsoft.mshtml」が表示されるので、左側のチェックを入れて「OK」ボタンをクリックします。
僕の環境だけかもしれませんが、2つ表示されたので、上側にチェックを入れました。
Interop.SHDocVw (Microsoft Internet Controls)
次に、もう一度、ソリューションエクスプローラの参照設定を右クリックし、「参照の追加」を選択します。
左側で「COM」を選択した状態で、右上の検索窓に、「Microsoft Internet Controls」を入力します。
真ん中の一覧に「Microsoft Internet Controls」が表示されるので、左側のチェックを入れて「OK」ボタンをクリックします。
名前が全然違うので、追加するのにかなり時間がかかりました。
現在のZoom値を取得する方法
では、ここからが実際にZoom値を取得する方法になります。
※ コード上に出てくるwebBrowserは、WebBrowserコントロールの参照です。
1 2 3 4 |
// 現在のズーム率を取得 var w = (mshtml.IHTMLWindow2 )webBrowser.Document.Window.DomWindow; var s = (mshtml.IHTMLScreen2 )w.screen; int zoom = s.deviceXDPI * 100 / 96; |
[補足] NGだった方法
Zoom値を設定するのにExecWBを使うので、同様に取得も可能と思いきや、例外が発生して取得できませんでした。
1 2 3 4 |
// 現在のZoom値を取得 int zoom = 0; ((SHDocVw.WebBrowser)webBrowser.ActiveXInstance).ExecWB( SHDocVw.OLECMDID.OLECMDID_OPTICAL_ZOOM, SHDocVw.OLECMDEXECOPT.OLECMDEXECOPT_DONTPROMPTUSER, null, zoom); |
↓
1 2 3 4 5 |
System.Runtime.InteropServices.COMException はユーザー コードによってハンドルされませんでした。 HResult=-2147221248 Message=登録されていないドロップ先の登録を解除しています (HRESULT からの例外:0x80040100 (DRAGDROP_E_NOTREGISTERED)) Source=PF ErrorCode=-2147221248 |
ネットで色々検索したけど、解決方法が分からず、辿り着いたのが今回の取得方法でした。
スポンサーリンク
Zoom値を設定する方法
今度は、Zoom値を設定する方法です。
Zoom値を%で指定します。(75%を設定するなら、75)
1 2 3 4 |
// ズーム率を設定 int zoom = 75; // Zoom率を%で指定 ((SHDocVw.WebBrowser)webBrowser.ActiveXInstance).ExecWB( SHDocVw.OLECMDID.OLECMDID_OPTICAL_ZOOM, SHDocVw.OLECMDEXECOPT.OLECMDEXECOPT_DONTPROMPTUSER, zoom , IntPtr.Zero); |
Zoom値を設定して拡大する方法
まとめとして、10%拡大する方法も書いておきます。
1 2 3 4 5 6 7 8 9 10 |
// 現在のズーム率を取得 var w = (mshtml.IHTMLWindow2 )webBrowser.Document.Window.DomWindow; var s = (mshtml.IHTMLScreen2 )w.screen; int zoom = s.deviceXDPI * 100 / 96; // 10%拡大する zoom += 10; ((SHDocVw.WebBrowser)webBrowser.ActiveXInstance).ExecWB( SHDocVw.OLECMDID.OLECMDID_OPTICAL_ZOOM, SHDocVw.OLECMDEXECOPT.OLECMDEXECOPT_DONTPROMPTUSER, zoom , IntPtr.Zero); |
おまけ
今回紹介した、Zoom値を設定しているExecWBを使えば、IEの各種機能をカンタンに呼び出すことができるようです。
例えば、クリップボードからの貼り付けをしたい場合は、以下のようにします。(ExecWBの第一引数で処理が決まります。)
1 2 |
((SHDocVw.WebBrowser)this.webBrowser.ActiveXInstance).ExecWB( SHDocVw.OLECMDID.OLECMDID_PASTE, SHDocVw.OLECMDEXECOPT.OLECMDEXECOPT_DONTPROMPTUSER); |