5ボタンマウス対応

id:siokoshou:20050519の日記で、ロジテックの6ボタンマウスを買ったことを書いたけど、その後いろいろあって、マイクロソフトの5ボタンマウスも手に入れてしまった。
マイクロソフトマウスのほうが軽いので、今はこっちに乗り換えてしまった。PC起動から時間が経つと戻る進むボタンが効かなくなる困りもんだったりもするんだけど...。まぁ、スタンバイにして復帰すれば直るので、休憩のアラームだと思うことにしてやりすごしている。
せっかく大手2つのボタンいっぱいマウスが手元にあるので、WinFormで「戻る、進む」ボタンに対応する方法をちょこっと調べてみた。
まずはマイクロソフトマウスから。こちらは普通にマウスのイベントで取れる。

  〜
  panel1.MouseDown  += new MouseEventHandler( panel1_MouseDown );
  〜

  private void panel1_MouseDown( object sender, MouseEventArgs e )
  {
    if ( e.Button == MouseButtons.XButton1 )
    {
      textBox1.Text = "Panel Click: Back" + Environment.NewLine + textBox1.Text;
    }
    else if ( e.Button == MouseButtons.XButton2 )
    {
      textBox1.Text = "Panel Click: Forward" + Environment.NewLine + textBox1.Text;
    }
    else
    {
      textBox1.Text = "Panel Click: " + e.Button + Environment.NewLine + textBox1.Text;
    }
  }

戻る(既定では手前の大きい親指ボタン)が XButton1、進む(既定では奥の小さい親指ボタン)が XButton2 に対応している。戻るボタンと進むボタンを入れ替えてもこの値は変わらない。左右のボタンの入れ替えと同様、ボタンと XButton1/2 の関係が入れ替わるだけ。

ロジテックのマウスはちょっとくせがある。SetPointという設定ツールを使ってマウスボタンの設定をするんだけど、既定では戻る進むはマウスボタンイベントが発生しない。じゃあ、どうなってるの?ってのは調べてないけど、キーイベントを起こすのかな?アプリに応じて送るキーを変えているのかもしれない。そのうち調べる気になったら調べる...かも(やる気ないなぁw)。
SetPointで戻る進むボタンの設定を汎用ボタンに変えると、マイクロソフトマウス同様、戻るが XButton1、進むが XButton2 になる。

コントロール上でクリックされたのを検出するだけなら、ここまでの情報でいいんですが、Form 上のどこでクリックしても戻る進むボタンを有効にしたいってなるともう一工夫必要になる。
Form に PreFilterMessage を組み込んでマウスボタンのメッセージを拾って処理するとうまくいく。

public virtual bool PreFilterMessage( ref Message m )
{
  switch ( m.Msg )
  {
    // 5ボタンマウスサポート
    case WM_XBUTTONDOWN:
      if ( ( (int)m.WParam & MK_XBUTTON1 ) != 0 )
      {
        ((Form1)form).Back();
        return true;
      }
      else if ( ( (int)m.WParam & MK_XBUTTON2 ) != 0 )
      {
        ((Form1)form).Forward();
        return true;
      }
      break;
  }
  return false;
}

private const int WM_XBUTTONDOWN = 0x20B;
private const int MK_XBUTTON1 = 0x20;
private const int MK_XBUTTON2 = 0x40;

PreFilterMessage の中で処理をしてしまっていいのか悪いのか、ちょっとよく分かりません。詳しい方がいらっしゃいましたら、コメントください。
このコードはRSS BanditのWheelSupportのソースを参考にした。このコードをFormに組み込む方法なんかはそっちを参考にして欲しい。

というわけで、アプリに戻る進むの機能があるなら、ぜひ5ボタンマウスに対応してください!ついでに5ボタンマウス買ってデバッグして、快適さを味わうといいかも。もう戻れないヨ(^-^)