キーイベント

今回はキー入力についてのお話です。

・WM_KEYDOWNとWM_KEYUP

WM_KEYDOWNはキーが押されている間キューにメッセージが送られます。
この時仮想キーのメッセージが wParam に入っているので、
それに対応する仮想キーコードを使って処理を行ったりします。
(仮想キーコードの定義は winuser.h に書かれています)
以下に一例を書いてみます。

          case WM_KEYDOWN:
               if(wParam==VK_ESC){
                    SendMessage (hwnd, WM_CLOSE, 0, 0);
                    return 0 ;
               } //if
               ……

ESCキーが押されると終了メッセージを送ります。

ただし、PocketPCの場合、SIPボタンのキーは
タップが離された後にWM_KEYDOWNが起こるので
あまりアクティブな操作には向いていませんね。

WM_KEYUPは、キーが離されるとキューにメッセージが送られます。

また、PocketPCには一般的に十字カーソルキーと4つのボタンがありますが、
アクションボタン以外の3つのボタンはWM_KEYDOWNでは取得できませんでした。
どう取得すればよいのやら・・・とことんゲームに不向きなようです。
(筆者の力不足なだけで、やり方はあるのかもしれませんが)

・WM_CHAR

WM_CHARは、仮想キーメッセージをTranslateMessage関数に通したとき
キューに文字メッセージがポストされます。
つまりWM_KEYDOWNが呼ばれた後にWM_CHARが呼ばれるわけですね。
'9'、'A'といった文字メッセージが wParam に入っているので
それを処理します。以下に分岐処理の一例を書きます。

          case WM_CHAR:
               switch ((char)wParam){
                    case '1':
                         SendMessage (hwnd, WM_CLOSE, 0, 0);
                         return 0;
               } //switch
               ……

'1'キーが押されると終了メッセージを送ります。

PocketPCのSIPボタンを押した場合、離された時点でやっと
WM_KEYDOWN→WM_CHAR→WM_KEYUPと
順に呼ばれることになります。

2005/5/20


戻る