GetAsyncKeyState

さて、今回はキーの入力を取得してみましょう。
WM_KEYDOWN?そんなの知りません。ていうかあんなの使いません。

・GetAsyncKeyStateによるキー入力判定

GetAsyncKeyStateは、なんとボタンの状態を取得することが出来るんです!
ボタンというのは説明することもないですが、PocketPCについている
アクションボタン等の4個のボタンのことです。

では以下にサンプルプログラムの処理の要点を書いていきます。

LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;
void Key_Check(HWND) ;

int iKeyst[8];
//ループ用wait変数
DWORD dWait;

Key_Checkは自作関数で、キー入力を判定する処理が入っています。
またグローバル変数として、十字キー+4個のボタンキーという
8個のキー状態を格納する変数iKeyst を宣言します。

//キー入力の判定
void Key_Check(HWND hwnd)
{
     //20ms経過してなければ戻る
     if(dWait+20>GetTickCount())
          return ;
     dWait=GetTickCount();

     iKeyst[0]=GetAsyncKeyState(VK_UP)&0x8000;
     iKeyst[1]=GetAsyncKeyState(VK_DOWN)&0x8000;
     iKeyst[2]=GetAsyncKeyState(VK_LEFT)&0x8000;
     iKeyst[3]=GetAsyncKeyState(VK_RIGHT)&0x8000;

     iKeyst[4]=GetAsyncKeyState(0xc1)&0x8000;//193
     iKeyst[5]=GetAsyncKeyState(0xc2)&0x8000;//194
     iKeyst[6]=GetAsyncKeyState(0x86)&0x8000;//134
     iKeyst[7]=GetAsyncKeyState(0xc4)&0x8000;//196

     //WM_PAINT発行
     InvalidateRect(hwnd , NULL , TRUE);
     return ;
}

GetAsyncKeyState 関数で、各キーが押されているかどうかの状態を判定します。
判定するキーを指定する時は、引数には仮想キーコードを使います。
またInvalidateRect で呼ばれるWM_PAINT内で
iKeyst[0]~iKeyst[7]の値を画面に描画する処理をしています。

では以上を踏まえたソースを実行してみましょう。

キー入力の取得

KeyStatesの32768 というのは、押されている状態を示しています。
また、押されてない状態では0 を返すので、実際に判定する時は
if(!GetAsyncKeyState(VK_UP)&0x8000) と、キーが0 以外の状態の時~と
処理すればいいわけです。
これを使えば、キーの同時入力も取得することも出来るわけです。

これによってボタンのキー入力を知ることが出来るようになりました。
しかし、世の中そう甘くはありません^^;
ボタンにアプリケーションを登録している場合、それを無視することが出来ないのです!
つまり、例えばアクションボタンにOutLookを登録していたら
ゲームをしようとしてボタンを押すとOutLookが起動してしまうわけで・・・
(自分はボタンには何も登録していないのでいいのですが)
このためだけに登録を全部解除してしまうのは忍びないですよね。
こういう時、GAPIを使えばプログラム内でキーをロックして占有してしまえるのですが。
GAPIも出来たらやりたいですね。

SHORT GetAsyncKeyState( int vKey);
・キーが押されているかどうか等を判定します。詳しくはMSDNをご覧下さい
第一引数 vKey には、仮想キーコードを指定します

戻り値 省略。詳しくはMSDNをご覧下さい

ソースの表示

2005/6/11


戻る