RAWINPUT避坑指南(涉及GetRawInputData/GetRawInputBuffer)
RAWINPUT流程:
1.使用GetRawInputDeviceList与GetRawInputDeviceInfo获取设备信息。
2.使用RegisterRawInputDevices注册设备,需要提前知道设备的Usage与UsagePage,
鼠标:UsagePage=0x01,Usage=0x02 UsagePage=0x01,Usage=0x06
3.使用GetRawInputData或者GetRawInputBuffer获取数据并处理。
4.停止的时候要注销设备,使用RegisterRawInputDevices,但是dwFlags=RIDEV_REMOVE.
在开发过程中需要注意以下几点:
1.GetRawInputData或者GetRawInputBuffer都可以获取数据,都依赖WM_INPUT消息,但是前者是一条一条获取,每次有消息到达就生成一条数据。后者是批量获取,一次性可以获取一个RAWINPUT的数组,但是需要有消息循环,不然是接收不到数据的。有了消息循环就可以自己决定什么时候去获取数据,只要有足够大的区域存放数据即可。
2.最好不要在 UI 线程或窗口过程(WindowProc)中直接进行 RawInput 数据处理,因为RawInput 捕获的输入事件是实时的,通常需要尽快处理和响应。如果将处理逻辑放在主线程或窗口过程中,特别是涉及大量数据转换、会导致明显的延迟和卡顿。这时候,可以开一个后台线程处理数据,或者创建一个新窗口专门用来接收WM_INPUT消息。
3.如果开发x86程序且使用了GetRawInputBuffer还需要注意,应用是否会在64位电脑上使用,在微软文档里有提到这一点,因此要注意有八个字节的偏移,不然获取到的数据都不对应。