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

No.3ベストアンサー
- 回答日時:
もっかい追記(^^;(調べ方が甘いなぁ・・・)
MapVirtualKey() APIでその場で変換できます。
第一引数に仮想キーコード、第二引数に2を指定してやれば仮想キーコードからASCII文字に変換できるはずです。
詳細はMSDNでどうぞ。
MapVirtualKey()
便利な関数があるのにそれを見つけることが出来ないというのは歯がゆいです
やっぱりリファレンスに一通り目を通さないといけないのかなぁ(^^;
lParamの説明大変参考になりました。
ホントにありがとうございました。

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

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++を使って調べてください。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
EBCDIC⇒SJIS変換の方法
-
ふりがなをアルファベット化す...
-
「彡」って文字はなんという文...
-
std::stringからLPCWSTR型への変換
-
コード変換について
-
セル内の文字列が日本語か英語...
-
半角全角混在(JIS)をJEF+EBCDI...
-
VB.NETのコンソールアプリケー...
-
COBOLによる全角・半角混...
-
C++でEUC-JPをSJISに変換したい。
-
ExcelVBA実行後に時々落ちる
-
ACCESSの日付の変換
-
RubyでCSV.read()で二次元配列...
-
C → C# への変換で書き方がわか...
-
PS4コントローラーをPCでゲーム...
-
Excelで入力禁止文字を設定したい
-
エクセルでアルファベットか数...
-
Chr(13)とChr(10)の違いは?
-
Excel セル内の最初と最後の改...
-
wordで均等割り付けをするとき...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
EBCDIC⇒SJIS変換の方法
-
「彡」って文字はなんという文...
-
セル内の文字列が日本語か英語...
-
std::stringからLPCWSTR型への変換
-
ふりがなをアルファベット化す...
-
sedで日本語の置換方法について
-
Symfowareでのデータ型変換につ...
-
COBOLによる全角・半角混...
-
VS 2008(VB.NET)
-
フォームのコントロールのバッ...
-
%fと%gについて
-
JIS → S-JIS コード変換するには
-
RubyでUTF8のコード値を文字に...
-
英数字を含む文字列(0-9,A-Z)...
-
2バイト文字をJEFからSJISに変...
-
CASLⅡ 文字データから数値デー...
-
ExcelVBA実行後に時々落ちる
-
latin-1 (ISO-8859-1)への変換
-
S-JIS → JIS コード変換するには
-
入力した文字を全て自動で全角...
おすすめ情報