0

各キーの状態を保存し、キーの左右のインスタンスを区別するために、ウィンドウに送信されるキーの押下をキャッチしたいと思いWM_LCONTROLますWM_RCONTROL

このWM_KEYUP/DOWN機能を提供していないので、生の入力に移動し、処理する必要がありますWM_INPUT

問題は、ここRAWKEYBOARDで説明されている構造体のフラグが正常に機能しないことです。

右のコントロールキーを押すRI_KEY_E0と、左バージョンのキー用に設定され、左のコントロールを押すと、どちらRI_KEY_E0RI_KEY_E1設定されません。Alt キーも同様に機能しますが、左キーは右キーとは異なるフラグを提供するため、この問題を回避できます。

しかし、左右のシフト キーについては、左のバージョンと右のバージョンを区別するフラグが設定されていないため、それらについては何もできません。

到着時に与えられる仮想キー コードWM_INPUTは左右のキーを区別せずMapVirtualKey、スキャン コードを使用しても機能しません。

生の入力のこの型破りな動作はどうしたのでしょうか?

いくつかのコード:

登録:

RAWINPUTDEVICE rid;
rid.usUsagePage=0x01;
rid.usUsage=0x06;
rid.dwFlags=0; // I also tried RIDEV_APPKEYS,RIDEV_NOHOTKEYS,RIDEV_NOLEGACY, none fixed the problem
rid.hwndTarget=hwnd;
if(!RegisterRawInputDevices(&rid,1,sizeof(RAWINPUTDEVICE)))
    ExitError("Failed to register raw input device",true); //displays error and exits

WM_INPUT の処理中:

case WM_INPUT:
{    
    RAWINPUT rw;
    UINT sz=sizeof(rw);
    u_char vk; //used to make code shorter
    USHORT flag; //used to make code shorter

    if(!GetRawInputData((HRAWINPUT)lparam,RID_INPUT,&rw,&sz,sizeof(RAWINPUTHEADER)))
        break;

    vk=rw.data.keyboard.VKey;
    flag=rw.data.keyboard.Flags;

    ...Process flags and save the actual key pressed in vk...

    keys[vk]=!(flag&RI_KEY_BREAK); //save key's state
    break;
}
4

3 に答える 3

1

WM_KEYDOWN/-UP必要な情報を提供します。MSDN の説明を読むだけです。

lParam パラメータのビット 24 を確認してください。

于 2012-05-18T12:42:00.823 に答える
0

WM_KEYDOWNいずれかのコントロールキーが押されたときに送信さWM_KEYUPれます。右側のコントロール キーが押されているかどうかを調べるには、 MSDN ドキュメントの説明に従って、のビット 24 を読み取ります。ビット 24 は次のように記述されます。VK_CONTROLwParamlParam

キーが拡張キー (拡張 101 キーまたは 102 キー キーボードに表示される右側の ALT キーや CTRL キーなど) であるかどうかを示します。拡張キーの場合、値は 1 です。それ以外の場合は 0 です。

于 2012-05-18T12:48:08.663 に答える