c++ - WM_INPUT 有缺陷

标签 c++ winapi input window

我想捕捉发送到我的窗口的按键以存储每个键的状态,并区分键的左右实例,如 WM_LCONTROLWM_RCONTROL.

因为 WM_KEYUP/DOWN 不提供此功能,所以我转向原始输入,我需要处理 WM_INPUT

问题是来自 RAWKEYBOARD 结构的标志,描述为 here ,不要像他们应该的那样工作。

当我按下右控制键时,RI_KEY_E0 被设置为左版本 键,当我按下左控制键时,RI_KEY_E0RI_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/

相关文章:

c++ - std::stoi 的基本参数

c++ - 非常基本的 C++ 程序问题——二进制表达式的无效操作数

c++ - wchar_t* 到字符串的转换

java - 如何从 Java 中的单行输入中读取多个整数值?

c++ - 多个应用程序如何使用同一个网络端口?

c++ - 用于修改网络接口(interface)属性的 Win32 API

c# - IShellItem 的 GUID

HTML:使用 Bootstrap 删除两个输入之间的空格

javascript - 当选择单选框时向输入字段添加属性

c++ - Static_Cast C++ 如何更改 INT 变量以显示 CHAR