OKWAVEのAI「あい」が美容・健康の悩みに最適な回答をご提案!
-PR-
解決
済み

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

  • 困ってます
  • 質問No.188052
  • 閲覧数403
  • ありがとう数2
  • 気になる数0
  • 回答数3
  • コメント数0

お礼率 83% (55/66)

いつもお世話になっております。
以下のような関数で押されたキーを判定しています。
lParmで得られるキーコードはVK_??のコードと違うようなのですが、
(キーボードの並び方順になってる?)
これをVK_??に変換するような方法はあるのでしょうか?
(本当はSHIFTデータもプラスして文字コードに変換したいのですが・・・)

何か良い方法があればアドバイスお願いいたします。

void CCtypeView::OnMsgfilterEdit1(NMHDR* pNMHDR, LRESULT* pResult)
{
MSGFILTER *pMsgFilter = reinterpret_cast<MSGFILTER *>(pNMHDR);

if( pMsgFilter->msg == WM_KEYDOWN )
{
SHORT sho = GetAsyncKeyState(VK_SHIFT);
TRACE( "%d : \nWM_LBUTTON x=%x,y=%d sho=%x",
pMsgFilter->msg,
HIWORD( pMsgFilter->lParam),
LOWORD( pMsgFilter->lParam),
sho );

}
*pResult = 0;
}
通報する
  • 回答数3
  • 気になる
    質問をブックマークします。
    マイページでまとめて確認できます。

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

  • 回答No.3
レベル11

ベストアンサー率 58% (114/195)

もっかい追記(^^;(調べ方が甘いなぁ・・・)

MapVirtualKey() APIでその場で変換できます。
第一引数に仮想キーコード、第二引数に2を指定してやれば仮想キーコードからASCII文字に変換できるはずです。
詳細はMSDNでどうぞ。
お礼コメント
ystk

お礼率 83% (55/66)

MapVirtualKey()
便利な関数があるのにそれを見つけることが出来ないというのは歯がゆいです
やっぱりリファレンスに一通り目を通さないといけないのかなぁ(^^;

lParamの説明大変参考になりました。
ホントにありがとうございました。
投稿日時 - 2001-12-20 15:30:00
-PR-
-PR-

その他の回答 (全2件)

  • 回答No.1
レベル11

ベストアンサー率 58% (114/195)

MSGFILTER構造体の説明を見た限りではメンバのmsgに対応したwparamとlparamが仕込まれているだけのようです。 であればWM_KEYDOWN時のlParamの意味を観ればいいだけです。 で、WM_KEYDOWNのlParamはというと・・・ 0から15bit・・・リピート回数。キーを押しつづけた時に発生するリピートの回数が入っています。 16から23bit・・・スキャン ...続きを読む
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++を使って調べてください。
  • 回答No.2
レベル11

ベストアンサー率 58% (114/195)

追記です。 どうも記号あたりなんかはOEM指定部分にマッピングされているようで、ハードコートすると不都合が発生する危険性がありそうです。 なので入力されたキャラクタが知りたいのであれば、TranslateMessage APIを使って仮想キーコードからWM_CHARメッセージに変換するのが一番良さそうです。 なおTranslateMessage()では直接変換後のWM_CHARメッセージがもらえるわ ...続きを読む
追記です。
どうも記号あたりなんかはOEM指定部分にマッピングされているようで、ハードコートすると不都合が発生する危険性がありそうです。
なので入力されたキャラクタが知りたいのであれば、TranslateMessage APIを使って仮想キーコードからWM_CHARメッセージに変換するのが一番良さそうです。
なおTranslateMessage()では直接変換後のWM_CHARメッセージがもらえるわけではなく、変換結果がメッセージキューに詰まれるだけなのでご注意を。
このQ&Aで解決しましたか?
-PR-
-PR-
こんな書き方もあるよ!この情報は知ってる?あなたの知識を教えて!
このQ&Aにはまだコメントがありません。
あなたの思ったこと、知っていることをここにコメントしてみましょう。

その他の関連するQ&A、テーマをキーワードで探す

キーワードでQ&A、テーマを検索する
-PR-
-PR-
-PR-

特集


いま みんなが気になるQ&A

-PR-

ピックアップ

-PR-
ページ先頭へ