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

10-13 01:01