- ベストアンサー
MSGFILTER lParmで得られるキーコードとは?
- MSGFILTER lParmで得られるキーコードは、キーボードの並び順になっているようです。
- VK_??に変換する方法は特にありませんが、VK_SHIFTを使用してシフトデータと組み合わせて文字コードに変換することができます。
- 他に良い方法があればアドバイスしてください。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
もっかい追記(^^;(調べ方が甘いなぁ・・・) MapVirtualKey() APIでその場で変換できます。 第一引数に仮想キーコード、第二引数に2を指定してやれば仮想キーコードからASCII文字に変換できるはずです。 詳細はMSDNでどうぞ。
その他の回答 (2)
- alfeim
- ベストアンサー率58% (114/195)
追記です。 どうも記号あたりなんかはOEM指定部分にマッピングされているようで、ハードコートすると不都合が発生する危険性がありそうです。 なので入力されたキャラクタが知りたいのであれば、TranslateMessage APIを使って仮想キーコードからWM_CHARメッセージに変換するのが一番良さそうです。 なおTranslateMessage()では直接変換後のWM_CHARメッセージがもらえるわけではなく、変換結果がメッセージキューに詰まれるだけなのでご注意を。
- alfeim
- ベストアンサー率58% (114/195)
MSGFILTER構造体の説明を見た限りではメンバのmsgに対応したwparamとlparamが仕込まれているだけのようです。 であればWM_KEYDOWN時のlParamの意味を観ればいいだけです。 で、WM_KEYDOWNのlParamはというと・・・ 0から15bit・・・リピート回数。キーを押しつづけた時に発生するリピートの回数が入っています。 16から23bit・・・スキャンコード。いわゆるOEMコードです。多分使わない。 24bit・・・右Ctrl、右Alt等の拡張キー。詳細はMSDNを参照。 25から28bit・・・予約。 29bit・・・コンテキストコード。WM_KEYDOWNでは常に0。 30bit・・・直前のキーの状態。押下されていた場合は1。 31bit・・・キーの遷移状態。WM_KEYDOWNでは常に0。 というようになっているようです。 また、仮想キーコードはwParamに入っていますのでそれを利用するのが良いと思います。 ただし@(アットマーク)や\(バックスラッシュ)等のキーに付いてはWINUSER.Hに定義がありません(実際にはVK_1からVK-0、VK_AからVK_Zも定義されてませんが)。 VK_1からVK_0、VK_AからVK_ZはASCIIにおけるそれぞれのキャラクタと同値なのでそのキャラクタ値と比較すれば判別できますが、その他の記号類に付いては文字コードなどと関連を付けてあるわけではないのでテーブルを用意しないと駄目だと思います。 なお、コードに関してはSpyやSpy++を使って調べてください。
お礼
MapVirtualKey() 便利な関数があるのにそれを見つけることが出来ないというのは歯がゆいです やっぱりリファレンスに一通り目を通さないといけないのかなぁ(^^; lParamの説明大変参考になりました。 ホントにありがとうございました。