各キーの状態を保存し、キーの左右のインスタンスを区別するために、ウィンドウに送信されるキーの押下をキャッチしたいと思い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;
}