いつもお世話になっております。
以下のような関数で押されたキーを判定しています。
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;
}

このQ&Aに関連する最新のQ&A

A 回答 (3件)

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



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

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

lParamの説明大変参考になりました。
ホントにありがとうございました。

お礼日時:2001/12/20 15:30

追記です。


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

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

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!


人気Q&Aランキング