• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:MSGFILTER lParmで得られるキーコード?)

MSGFILTER lParmで得られるキーコードとは?

このQ&Aのポイント
  • MSGFILTER lParmで得られるキーコードは、キーボードの並び順になっているようです。
  • VK_??に変換する方法は特にありませんが、VK_SHIFTを使用してシフトデータと組み合わせて文字コードに変換することができます。
  • 他に良い方法があればアドバイスしてください。

質問者が選んだベストアンサー

  • ベストアンサー
  • alfeim
  • ベストアンサー率58% (114/195)
回答No.3

もっかい追記(^^;(調べ方が甘いなぁ・・・) MapVirtualKey() APIでその場で変換できます。 第一引数に仮想キーコード、第二引数に2を指定してやれば仮想キーコードからASCII文字に変換できるはずです。 詳細はMSDNでどうぞ。

ystk
質問者

お礼

MapVirtualKey() 便利な関数があるのにそれを見つけることが出来ないというのは歯がゆいです やっぱりリファレンスに一通り目を通さないといけないのかなぁ(^^; lParamの説明大変参考になりました。 ホントにありがとうございました。

その他の回答 (2)

  • alfeim
  • ベストアンサー率58% (114/195)
回答No.2

追記です。 どうも記号あたりなんかはOEM指定部分にマッピングされているようで、ハードコートすると不都合が発生する危険性がありそうです。 なので入力されたキャラクタが知りたいのであれば、TranslateMessage APIを使って仮想キーコードからWM_CHARメッセージに変換するのが一番良さそうです。 なおTranslateMessage()では直接変換後のWM_CHARメッセージがもらえるわけではなく、変換結果がメッセージキューに詰まれるだけなのでご注意を。

  • alfeim
  • ベストアンサー率58% (114/195)
回答No.1

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++を使って調べてください。