いつもお世話になっております。
以下のような関数で押されたキーを判定しています。
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と関連する良く見られている質問

Qint select(int n, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout)について

見当違いな質問かもしれませんがお願いします。

複数のソケットを監視する際にselectを使う場合のことですが、
selectの動作と戻り値について疑問があります。

http://www.linux.or.jp/JM/html/LDP_man-pages/man2/select.2.html
ここを参照すると、selectの戻り値は
「更新された 3 つのディスクリプタ集合に含まれているディスクリプタの数 (つまり、 readfds, writefds, exceptfds 中の 1 になっているビットの総数) を返す。」
とあります。
私の中でselectは登録してあるFDのうち、一つでも動きがあれば即座にselectを抜けるもの、という認識です。
この認識だとreadfds,writefdsが引数として与えられているとしても、
どちらかのfd_setのうち、一つでも動きがあればselect文は
抜けてしまうことになります。とすると、戻り値として
「readfds, writefds, exceptfds 中の 1 になっているビットの総数」
は常に1ということになってしまいます。しかし、総数というからには
複数同時に1になることもあるはずです。

私の認識が間違っているとは思うのですが、どう間違っているのかわかりません。
select文の動きについて詳しく教えていただけないでしょうか。
または良いページがあれば教えてください。

見当違いな質問かもしれませんがお願いします。

複数のソケットを監視する際にselectを使う場合のことですが、
selectの動作と戻り値について疑問があります。

http://www.linux.or.jp/JM/html/LDP_man-pages/man2/select.2.html
ここを参照すると、selectの戻り値は
「更新された 3 つのディスクリプタ集合に含まれているディスクリプタの数 (つまり、 readfds, writefds, exceptfds 中の 1 になっているビットの総数) を返す。」
とあります。
私の中でselectは登録してあるFDのうち、一つでも動きが...続きを読む

Aベストアンサー

>私の中でselectは登録してあるFDのうち、一つでも動きがあれば即座にselectを抜けるもの、という認識です。
この認識はあっています。
しかし、selectを呼び出す以前にOKになっているFDがあれば、それらは全てビットがONになります。

話しを簡単にする為に、受信のみのソケットを3つ作成したとします。
これらの3つのソケットに向けて相手が電文を送ったとします。
その状態でまだ、こちらはselectを呼び出さずにいます。しばらくしてから、selectを呼び出すと、selectは即座にリターンし、3つのビットが一度にONになっているはずです。
一方、相手が、一切電文を送ってない状態で、selectを呼び出した場合は、何れかのビットがONになればリターンするので、そのときは、貴方が想像しているように
ビットの総数は1になる可能性が高いです。
従って、相手が電文を送る前にselectを呼び出すか、送った後にselectを呼び出すかは、その時のタイミングにより異なります。従って、ビット数の総和が常に1であるとは、考えない方が無難です。(1つのソケットしか使用しない場合は別ですが・・・)

>私の中でselectは登録してあるFDのうち、一つでも動きがあれば即座にselectを抜けるもの、という認識です。
この認識はあっています。
しかし、selectを呼び出す以前にOKになっているFDがあれば、それらは全てビットがONになります。

話しを簡単にする為に、受信のみのソケットを3つ作成したとします。
これらの3つのソケットに向けて相手が電文を送ったとします。
その状態でまだ、こちらはselectを呼び出さずにいます。しばらくしてから、selectを呼び出すと、selectは即座にリターンし、3つのビ...続きを読む

Qこの”void(*m_pViewMode)(BYTE,BYTE,WORD);”このソースコードの意味は?

今、みているソースコードで次のようなコードがありました。


void(*m_pViewMode)(BYTE,BYTE,WORD);

--------(中略)----------------------------

m_pViewMode(err == 0 ? stKey.key : 0x00,clear,stKey.time);


全く何をどうやっているのかよくわからないのですが、これはC言語ではどのようなことをやっているソースコードなのでしょうか?

ご存じの方いらっしゃいましたらご教授お願いいたします。

Aベストアンサー

> void (*m_pViewMode)(BYTE,BYTE,WORD);
これは「関数へのポインタ」型の変数を宣言している。
m_pViewModeはBYTEとBYTEとWORDを引数に取り、返り値のない関数を保持するポインタ変数になる。

> m_pViewMode(err == 0 ? stKey.key : 0x00,clear,stKey.time);
ここでは、m_pViewModeに代入された関数を実行している。
「err == 0 ? stKey.key : 0x00」の部分が最初の引数で、三項演算子?:を用いてerrが0のときはstKey.keyを、それ以外では0x00を最初の引数にする。

Qint i,j; \n i=0,j=5;

int i,j;
i=0;
j=5:
と書いてあるソースは普通ですが、
int i,j;
i=0,j=5:
と書いてあるソースもあります。
後者はC++の正しい書式ですか?

カンマ演算子というのは後者のカンマのことですか?

Aベストアンサー

 正しい書式です。

i=0,j=5;
 における、「,」をカンマ演算子といいます。2項の演算子です。カンマで区切られた演算を「左から順番に」実行し、最後の演算を結果として返します。
 したがって、例の文であれば、i=0を実行し、次にj=5を実行。そして、j=5の結果の5を結果として返します。
 ・・・
 が、本来的には、あまり、例のような使い方はしませんね。よく見られるのは、次のような場合です。

 for (i=0,j=0 ; i < 50 ; ++i,++j) {

 のような形でよく見られます。for文の各式は、一つの式でなければならないので、こんな書き方をするわけです。初期化と更新部が一つにまとまり、ループが読みやすくなるのが利点かな。

Qfor(s=p; *p; p++)の*p(ポインタ)の意味

for(s=p; *p; p++)の*p(ポインタ)の意味
C言語初心者です。
今ポインタを勉強しているのですが、
for文で上記のようなものが出てきて、意味が分からず困っています。
*pで*p != NULL と同じような意味になるみたいなのですが…。
どうしてそのような意味になるのでしょうか?

ちなみにsとpはポインタで、
sには配列(入力した文字列)の先頭アドレスが入っています。
pは文字列を指していて○○○○○NULL ←になるから上記のような条件で
回るんだろうなぁとはなんとなく考えているのですが。

Aベストアンサー

念のため:
ヌルポインタは「ビットパターンとして」0 じゃないかもしれませんが, ソースプログラムにおいて「ポインタが要求される場面」で「0」とあれば, それは「ヌルポインタ」です.
もうちょっと厳密に書くと「整定数 0」はヌルポインタに変換される.

Qfor(int i = 100, long n = 1; i > n/3i; i++)

for(int i = 100, long n = 1; i > n/3i; i++)
のように、初期設定で型の違う変数を宣言したいんだけど
C++ではこんなふうに2つ以上の型を宣言してはいけないんですか?

Aベストアンサー

,

コンマ演算子の原理です。
forの初期化文で "," で区切れるのは値を返す文だけです。
よってintステートメントもlongステートメントも値を返さないので、この文では使用できません。

というか、むしろ、intステートメントの第2引数としてlongが認識されてしまいます。
外で

int i; long n;

とし

for(i = 0, n = 0; hoge; hoge)

なら可能です。


人気Q&Aランキング

おすすめ情報