gpt4 book ai didi

c++ - WM_INPUT 有缺陷

转载 作者:行者123 更新时间:2023-11-28 08:04:10 26 4
gpt4 key购买 nike

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

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com