我想捕捉按键发送到我的窗口,以存储每个键的状态,并区分键的左右实例,例如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;
}