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