左右キーを区別するには?

解決


F0  2010-03-12 18:08:39  No: 71474  IP: [192.*.*.*]

VisualStudio2008 WindowsXPです。

WM_KEYDOWNやWM_SYSKEYDOWNで、仮想キーコードを知りたいときは、WPARAMを使えばいいのですが、そうすると、ShiftキーやCtrlキーなどで左右の区別ができません。

LPARAM(スキャンコード)とMapVirtualKey関数を使って取得すると、Shiftキーは問題ないのですが、CtrlキーやAltキーなどの拡張キーは左右の区別がされていませんでした。

どうすればShiftキーやCtrlキーなどの左右の区別をすることができますか?

編集 削除
aetos  2010-03-12 19:51:18  No: 71475  IP: [192.*.*.*]

GetAsyncKeyState ではどうでしょう?

編集 削除
F0  2010-03-12 20:55:15  No: 71476  IP: [192.*.*.*]

GetAsyncKeyState関数などは、「その時点で特定のキーを押しているか」を判断する関数なので、例えば「左右同時押し」などの状況では使えないのではないか……と考えております。

編集 削除
参考程度に  2010-03-13 03:51:11  No: 71477  IP: [192.*.*.*]

>WM_KEYDOWNやWM_SYSKEYDOWNで、仮想キーコードを知りたいときは、
>WPARAMを使えばいいのですが、そうすると、ShiftキーやCtrlキーなどで
>左右の区別ができません。

この状態でlParamを見ればよいのでは?
私の環境ではwParam + lParamで普通に判別できましたよ?

>「左右同時押し」などの状況では使えないのではないか……と
>考えております。
そういう後出し条件は想定外だったので参考程度で。

編集 削除
F0  2010-03-13 14:31:44  No: 71478  IP: [192.*.*.*]

ありがとうございました。解決しました。

編集 削除
aetos  2010-03-15 12:25:57  No: 71479  IP: [192.*.*.*]

> 例えば「左右同時押し」

GetAsyncKeyState を左右それぞれについて呼べばいいと思います。
ものすごく厳密に言えば、2回目の呼び出しの時にはもう1回目のキーを離している可能性もありますが、そこまでの精度は必要ないのでは。

GetKeyboardState という、全キーの状態を一度に取得できる関数もありますが、説明が長ったらしくてよくわかりませんし、前述ほどの精度があるかどうかも不明です。

編集 削除