マウスやキーボードの入力は通常はWM_KEYDOWNやWM_MOUSEMOVEなどのメッセージから受け取るの ですが、それらのメッセージ以外の場所でも必要になる場合があると思います。そこで今回は入力を 非同期に取得する方法を紹介したいと思います。
BOOL GetCursorPos(LPPOINT)
POINT構造体のアドレスを引数にいれてGetCursorPosを呼び出すと、デスクトップ画面の左上を(0,0)の始点とした 座標が取得できます。自分のプログラムのクライアント領域を始点にしたい場合はScreenToClient(HWND,LPPOINT)を 呼び出すことにより変更可能です。
SHORT GetAsyncKeyState(int);
この関数を調べたいキーのキーコードを引数に入れて呼び出します。指定したボタンが押されている場合は
最上位ビットが立つので返戻値がマイナスになります。
仮想キーコードの例として、VK_LBUTTON(マウスの左),VK_RBUTTON(マウスの右),VK_RETURN(リターン),VK_SHIFT(Shift)
,VK_CAPITAL(CapsLock),VK_ESCAPE(Escape)などがあります。
ここで注意してもらいたいところがあります。マウスの左と右に関しては物理的な位置になっているのでWindowsの設定で変更してある
場合は実際のものとは逆になってしまいます。そこでGetSystemMetrics(SM_SWAPBUTTON)を呼び出し
返戻値がTRUEなら位置が逆転していると分かりますので適切な処理をするようにしてください。
また、アルファベットの小文字と大文字を判定するのも少し手間がかかります。例えばaを判定したい場合は
GetAsyncKeyState('A')を呼び出してAの位置のキーを判定するのですが('a'では反応しません)CapsLockがオンになっていたり
Shiftキーが押されていたりする場合は実際は大文字のAなので正しくありません。