はじめに
Windows Forms上でウェブページを表示するためのコントロールとしてSystem.Windows.Forms.WebBrowserクラスが標準で用意されています。
しかし、なぜか5ボタンマウスに付いている「戻るボタン」「進むボタン」を押してもページが切り替わりません。
WebBrowserコントロールでマウスの戻る・進むボタンに対応させる方法を紹介します。
対処方法
WebBrowserクラスは、MouseDownイベントによるイベントハンドリングができない。そのためMouseEventArgsのButtonプロパティの値がMouseButtons.XButton1とMouseButtons.XButton2であるかどうかで判定する方法は使えない。その代わりにウィンドウメッセージを捕捉することにする。
WebBrowser上でマウスの「戻るボタン」「進むボタン」が押されるとWM_APPCOMMANDメッセージが発生する。そこでWebBrowserクラスを継承し、WndProcメソッドをオーバーライドしてWM_APPCOMMANDメッセージを捕捉することで「戻るボタン」「進むボタン」が押されたことを検知できる。
さらに押されたボタンの種類を調べるためにm.LParamからGET_APPCOMMAND_LPARAMメソッドによって押されたボタンの種類を演算して求める。
public class WebBrowserEx : System.Windows.Forms.WebBrowser
{
const short BROWSER_BACKWARD = 1;
const short BROWSER_FORWARD = 2;
const int WM_APPCOMMAND = 793;
protected override void WndProc(ref Message m)
{
if (m.Msg == WM_APPCOMMAND)
{
switch (GET_APPCOMMAND_LPARAM(m.LParam))
{
case BROWSER_BACKWARD:
GoBack();
return;
case BROWSER_FORWARD:
GoForward();
return;
}
}
base.WndProc(ref m);
}
private int GET_APPCOMMAND_LPARAM(IntPtr lParam)
{
return (int)(lParam.ToInt64() >> 16) & 0xFFF;
}
}
あとは、WebBrowserクラスをWebBrowserExクラスに置き換えてインスタンスを作成すれば、戻る・進むボタンの操作に応じてウェブブラウザ内のページが切り替わる。
WebView2では標準で対応
新しいEdgeに準拠したWebView2では、「戻るボタン」「進むボタン」に対応しているので、最新のWeb標準にも準拠しているWebView2を今後は使うべきだと思います。