我想捕捉发送到我的窗口的按键以存储每个键的状态,并区分键的左右实例,如 WM_LCONTROL
和 WM_RCONTROL
.
因为 WM_KEYUP/DOWN
不提供此功能,所以我转向原始输入,我需要处理 WM_INPUT
。
问题是来自 RAWKEYBOARD
结构的标志,描述为 here ,不要像他们应该的那样工作。
当我按下右控制键时,RI_KEY_E0
被设置为左版本
键,当我按下左控制键时,RI_KEY_E0
和 RI_KEY_E1
均未设置。
alt 键的执行方式类似,但我可以解决这个问题,因为左键仍然提供与右键不同的标志。
但是对于左右 shift 键,没有设置任何标志来区分左版本和右版本,所以我无法对它们做任何事情。
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/