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です。
>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ですね。
すみません、誤りがありましたので訂正します。
予想「41」→「05」
予想「81」→「09」
予想「40」→「04」
予想「80」→「08」
でした。
検出はうまくできるようになりました。
なのでおっしゃられる通りTRACE表示時がおかしいのだと思います。
しかしご教示いただいたように「%08x」でやってみたのですが、現象は変わりませんでし
た。
キャストとかいろいろやってみたのでしょうが、なんででしょうね…?(@@;)
でも迷宮に入りそうだったので助かりました。ありがとうございます。