0

WM_KEYDOWN を受信したときに LPARAM 変数 (メインの WNDPROC に送信される) の値 (ビット) を検査する簡単なコードがあります。

しかし、私はそこにいくつかの面白い値を取得しています: MSDNでは、http://msdn.microsoft.com/en-us/library/ms646280(v=vs.85).aspx、最後のビット(LPARAMの)キーダウンメッセージの場合は常に0にする必要がありますが、LPARAM値を出力すると常に1になりますか? また、スキャン コードは 5 (矢印キーまたは Windows キーを押したとき) または通常の文字と数字の 0 の間でのみ変更されます。

最後にShiftキーを長押しするとリピート回数が増えるのではないでしょうか?これを行うと、繰り返し回数はゼロのままになりますか?

LPARAM 値を検査するためのコードが間違っているのでしょうか、それともメッセージ ポンプ全体でしょうか?

LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{

    switch(msg)
    {
        case WM_KEYDOWN:
        {
            outputLParam( lParam );
            outputLParamDefault( lParam );
            //printf("A: %d, %d, %d\n", lParam & 0x30, lParam & 0x31, lParam & 0x32 );
            //printf("\n");
        }
        break;
        case WM_CLOSE:
            DestroyWindow(hwnd);
        break;
        case WM_DESTROY:
            PostQuitMessage(0);
        break;
        default: 
        break;
    }

    return DefWindowProc(hwnd, msg, wParam, lParam);
}

void outputLParam( LPARAM lParam )
{
    printf("Repeat Count        : %d\n", (lParam >> 0x01) & ((1<<15)-1));  // print the value of the 1st 15 bits
    printf("Scan Code           : %d\n", (lParam >> 0x16) & ((1<<7)-1));   // print the value of the next 7 bits
    printf("Extended Key        : %d\n", lParam & 0x24);                   // print the value of the next bit
    printf("Reserved            : %d\n", (lParam >> 0x25) & ((1<<3)-1));   // print the value of the next 3 bits
    printf("Context             : %d\n", lParam & 0x29);                   // print the value of the next bit
    printf("Prev Key State      : %d\n", lParam & 0x30);                   // print the value of the next bit
    printf("Transition Key State: %d\n", lParam & 0x31);                   // print the value of the next bit
}

void outputLParamDefault( LPARAM lParam )
{
    printf("LPARAM: ");

    for ( int i=0x01, j=0; j<32; j++, i++)
    {
        printf("%d", lParam & i);
    } 

    printf("\n");
}
4

3 に答える 3

1

ビットを検査するためのコードが間違っており、コメントに記載されているビットグループが間違っています。

たとえば、ドキュメントによると、下位 16 ビットは繰り返し回数です。

あなたはそれを手に入れます

(lParam >> 0) & ((1L << 16) - 1)

明らかにあなたのコードが使用する「システム」で。

対照的に、コードの式は正しくありません(lParam >> 0x01) & ((1<<15)-1))

スキャン コードは、7 ビットではなく、次の 8 ビットです。

乾杯 & hth.,

于 2011-08-09T09:33:34.027 に答える
0

すべてのマスク カウントが間違っており、繰り返しカウント オフセットが間違っています。繰り返しカウントはビット 0 (ビット 1 ではない) から始まるため、シフトする必要はなく、マスクは上位ビットを逃します。

于 2011-08-09T09:35:10.267 に答える
0

以前に回答した質問は、あなたの状況に関連しています。ビットシフトで混乱を招くのではなく、カスタム構造を作成します。

于 2011-08-10T21:01:50.307 に答える