メッセージだけでキー入力を拾ってみる

 WinAPIを使っての入力の取得は、基本的には

if( GetAsyncKeyState( vk ) )*1

で大丈夫なんですが、コレが使えないときはどうするか?

という話。



 一番よく見かける(?)のは

・WindowのプロシージャでWM_KEYDOWNを確認する

方法。WPARAMを見るだけなのでラクチン。

 基本的にはこれで大丈夫なのですが、

環境・ハード・バージョン等諸々の違いにより、たまに妙な値が入ってくることがあります。

具体的には、「VK_PROCESSKEY*2」とか。

この値が来た時は「ImmGetVirtualKey()」や「MapVirtualKey()」を使えば仮想キーを拾えます。*3

 ただ、この変換を噛ましてしまうと、本来の「WinAPIを使わない」という目的からそれるので、更に別の方法を調べてみる。



 そこで出てくるのが、

・WindowのプロシージャでWM_CHARを確認する

方法。やはりWPARAMを見るだけなのでラクチン。

しかも、TranslateMessage()に解釈された後だからか何故かを知らないが、

WM_KEYDOWNでVK_PROCESSKEYが入っているような状況でも、こちらなら通常の仮想キーコードが取得できます。





 後、「Alt」との同時入力の場合は、

上記のメッセージにSYSを付けて、「WM_SYSKEYDOWN」や「WM_SYSCHAR」にして使えば同じ意味合いになるみたい。(未確認(酷))




*1:押下の瞬間を拾うのであれば「if( (GetAsyncKeyState( vk ) & 0x8000) == 0x8000 )」の方が意味合いとしては正しいが、
Cのif文は「0or非0」で確認するので、コレで大丈夫。

*2:=0xE5。または0x80 + 'e'

*3:但し、英字だった場合は何故か大文字ではなく「小文字のASCII」が返ってくるようなので注意!