酢ろぐ!

カレーが嫌いなスマートフォンアプリプログラマのブログ。

Windows MobileでHardwareButtonクラスを使ってハードウェアボタンが押下されたのを検知する

HardwareButtonクラスは、PokcetPCのハードウェアボタンの機能をオーバーライドします。コントロールに関連付けを行うと、ボタンが押された時にKeyDownイベントを受け取り、ボタンが離されるとKeyUPイベントを受け取ります。

端末によって実装されているハードウェアキーの個数が異なっておりアプリケーションキー全てに対応させる為、6つのアプリケーションキーに対応させたHardwareButtonクラスのオブジェクトを生成し、ハードウェアボタンをオーバーライドさせます。

   public partial class MainForm : Form
   {
       // ハードウェアボタンを管理する配列を用意する
       HardwareButton[] hwbs = new HardwareButton[6];

フォームのコンストラクタで、HardwareButtonクラスを生成しハードウェアボタンが押下された時アクティブにする為にAssociatedControlプロパティにフォームを設定します。 ボタンが離された時に発生するKeyUpイベントと後述するOnKeyUpメソッドを関連付けます。

   public MainForm()
   {
       InitializeComponent();

       // KeyUpイベントを生成します
       this.KeyPreview = true;
       this.KeyUp += new KeyEventHandler(this.OnKeyUp);

       // ハードウェアボタンの定義の配列を作成
       HardwareKeys[] hwKeys = {
           HardwareKeys.ApplicationKey1,
           HardwareKeys.ApplicationKey2,
           HardwareKeys.ApplicationKey3,
           HardwareKeys.ApplicationKey4,
           HardwareKeys.ApplicationKey5,
           HardwareKeys.ApplicationKey6
       };

       // HardwareButtonクラスを生成し、
       // ハードウェアボタンが押下された時、
       // 関連付けたフォームをアクティブにする様設定を行う
       for (int i = 0; i < hwbs.Length; i++)
       {
           hwbs[i] = new HardwareButton();
           hwbs[i].AssociatedControl = this;
           hwbs[i].HardwareKey = hwKeys[i];
       }
   }

ハードウェアボタンを離すとKeyUpイベントが発生し、先程関連付けを行ったOnKeyUpメソッドがコールされます。

   private void OnKeyUp(object sender, KeyEventArgs e)
   {
       switch ((HardwareKeys)e.KeyCode)
       {
           case HardwareKeys.ApplicationKey1:
               statusBar1.Text = "Button 1 pressed.";
               break;
           case HardwareKeys.ApplicationKey2:
               statusBar1.Text = "Button 2 pressed.";
               break;
           case HardwareKeys.ApplicationKey3:
               statusBar1.Text = "Button 3 pressed.";
               break;
           case HardwareKeys.ApplicationKey4:
               statusBar1.Text = "Button 4 pressed.";
               break;
           case HardwareKeys.ApplicationKey5:
               statusBar1.Text = "Button 5 pressed.";
               break;
           case HardwareKeys.ApplicationKey6:
               statusBar1.Text = "Button 6 pressed.";
               break;
           default:
               break;
       }
   }

端末によって実際に実装されているハードウェアボタンの数が異なりますので、筆者の所有しているemobileのS11HT(EMONSTER)を利用して、上記のサンプルコードを用いてテストを行った所、IEボタンを押下するとアプリケーションキー3、OKボタンはアプリケーションキー4のキーイベントが発生していました。

関連記事

Windows Mobile(.NET Compact Framework)を使ってアプリ開発する際に逆引きとしてお使いください。