wParamでShiftキーやCtrlキーの検出ができない? – プログラミング – Home

通知
すべてクリア

wParamでShiftキーやCtrlキーの検出ができない?


タピオカくん
 タピオカくん
(@タピオカくん)
ゲスト
結合: 9年前
投稿: 4
Topic starter  

GetMessageでイベントを取得し、マウス操作処理するプログラムを作ってます。
ところがShiftキーやCtrlキーの検出がうまくいきません。
これらの状態はwParamを参照すればいいはずなのですが、TRACE文でその中身を表示させ
たところ、予想と違う値が表示されて困惑しています。
これはどういうことでしょうか?

以下、出力内容です。値は16進数。

Shift+Lbutton…予想「41」、実際「11」など。
Ctrl+Lbutton…予想「81」、実際「11」「10」など。
Shiftキーのみ…予想、実際ともに「40」。これはOK。
Ctrlキーのみ…予想、実際ともに「80」。これはOK。

以下、ソースコードです。

MSG msg;

for(;;) {
if (!(::GetMessage(&msg, NULL, 0, 0))) continue;

pnt = MAKEPOINTS(msg.lParam);

TRACE(%02x , msg.wParam); // ここがおかしい!

if (msg.wParam & MK_SHIFT) {
Shiftキー押下時の処理
}

if (msg.wParam & MK_CONTROL) {
Ctrlキー押下時の処理
}
}

環境はVisualStdio2003です。


引用解決済
トピックタグ
仲澤@失業者
(@uncle_kei)
Prominent Member
結合: 5年前
投稿: 828
 

>TRACE(%02x , msg.wParam); // ここがおかしい!

のコードが変ですよね。wParamはWPARAM型なので32bitプラットホーム用に
コンパイルした場合は32bitのunsignedの整数型ですよね。
トレースするなら %08Xまたは%08xでフォーマットすべきでしょう。
これが間違っていると迷宮に入ってしまいます。

次に、WM_LBUTTONDOWNのwParamの説明には
・・・This parameter can be one or more of the following values.
とありますので、ビット演算のORで提供されます。
従って、「左ボタン=MK_LBUTTON」と同時に「SHIFTキー=MK_SHIFT」が押されていたら

wParam は (MK_LBUTTON | MK_SHIFT) の状態になっているはずです。
つまり0x00000005ですね。


返信引用
タピオカくん
 タピオカくん
(@タピオカくん)
ゲスト
結合: 9年前
投稿: 4
Topic starter  

すみません、誤りがありましたので訂正します。

予想「41」→「05」
予想「81」→「09」
予想「40」→「04」
予想「80」→「08」

でした。

検出はうまくできるようになりました。
なのでおっしゃられる通りTRACE表示時がおかしいのだと思います。
しかしご教示いただいたように「%08x」でやってみたのですが、現象は変わりませんでし
た。
キャストとかいろいろやってみたのでしょうが、なんででしょうね…?(@@;)
でも迷宮に入りそうだったので助かりました。ありがとうございます。


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました