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

[戻る]
タピオカくん 2015/09/11(金) 15:56:09
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です。

仲澤@失業者 2015/09/11(金) 16:50:12
>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ですね。

タピオカくん 2015/09/14(月) 11:23:27
すみません、誤りがありましたので訂正します。

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

でした。

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

古いスレッドには追加発言できません。