我想捕获发送到我的窗口的按键,以存储每个按键的状态,并区分按键的左右实例,例如WM_LCONTROL
和WM_RCONTROL
。
由于WM_KEYUP/DOWN
不提供此功能,因此我移至原始输入,并且需要处理WM_INPUT
。
问题在于RAWKEYBOARD
结构中的标记(描述为here)无法正常工作。
当我按向右控制键时,将为RI_KEY_E0
设置左侧的版本
键,然后按左控制键时,既没有设置RI_KEY_E0
也没有设置RI_KEY_E1
。
alt键的性能类似,但是我可以解决此问题,因为left仍然提供与right键不同的标志。
但是对于左右移位键,没有设置任何标志来区分左版本和右版本,因此我对此无能为力。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;
}
最佳答案
WM_KEYDOWN/-UP
确实提供了您想要的信息,您只需要阅读MSDN中的描述。
检查lParam参数的位24。
关于c++ - WM_INPUT有缺陷,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10652713/