各キーの状態を保存し、キーの左右のインスタンスを区別するために、ウィンドウに送信されるキーの押下をキャッチしたいと思いWM_LCONTROLますWM_RCONTROL。
このWM_KEYUP/DOWN機能を提供していないので、生の入力に移動し、処理する必要がありますWM_INPUT。
問題は、ここRAWKEYBOARDで説明されている構造体のフラグが正常に機能しないことです。
右のコントロールキーを押すRI_KEY_E0と、左バージョンのキー用に設定され、左のコントロールを押すと、どちらRI_KEY_E0もRI_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;
}