4

Win32アプリケーションは、最初のWM_KEYDOWN通知のみにどのように応答できますか?MSDNドキュメントのクレームビット30「以前のキーの状態を指定します。メッセージが送信される前にキーがダウンしている場合は値は1であり、キーがアップしている場合はゼロです。」しかし、私のWndProcではビット30は常に0です。

case WM_KEYDOWN:
    // ToDo - stop multiple notifications for repeating keys
    printf("WM_KEYDOWN %i %i", wParam, lParam & 30);
    return 0;

lParam&30はこれを求める間違った方法ですか?私は何か他のことを間違っていますか?

4

4 に答える 4

11

ビット30をテストするには、30とANDしないでください。代わりに、1<<30とANDしてください。

const bool isBitSet = lParam & (1 << 30);
于 2009-09-01T14:33:11.323 に答える
4

ビット30を取得するには、次のものが必要です。

(lParam & 0x40000000)

別の方法は、ビット0〜15を使用して繰り返し回数を取得することです。

int repeatCount = (lParam & 0xffff)

繰り返し回数が0(または1の場合もあります。最初のメッセージの繰り返し回数が0または1かどうかはわかりませんが、ドキュメントからは明らかではありません)の場合にのみ何もしません。

于 2009-09-01T14:33:07.110 に答える
4

ビット単位のANDは機能しますが、Windows.hに含まれている定義(すでに使用している)(lParam & 0x4000000)を使用して、簡単に読みやすくすることができます。WM_KEYDOWN

case WM_KEYDOWN:
    if((HIWORD(lParam) & KF_REPEAT) == 0) //process wParam
    return 0;

HIWORD最上位16ビットを取ります。

KF_REPEATWM_KEYDOWN(= 0x4000)は、リピートメッセージを表すビットの場所にフラグを立てます。

これらの値のビットごとのANDは、繰り返しフラグがオフの場合(最初のキー押下)は0に等しく、キーが解放されるまで(自動繰り返し機能)その後は毎回1に等しくなります。

これは小さなことですが、コードの可読性を向上させるのに大いに役立ちます。0x40000000から多くを推測することができますが、読者には何の意味もありません KF_REPEAT

于 2014-11-10T11:28:48.260 に答える
1

lParam&30を実行する際の問題は、ここでの「30」は10進数であると見なされ、2進数に変換すると「11110」になることです。したがって、ビット30をテストするのではなく、lparam&11110の結果を取得するだけです。

これが問題を少し明確にするのに役立つことを願っています。

于 2009-09-02T18:35:02.013 に答える