赞
踩
rawinput获取数据的2个api getrawinputdata()和getrawinputbuffer()
msdn并未说明什么情况下使用哪种api,而一般来说getrawinputdata()就可以获取到数据的,想当然的我们就会认为只需要使用其中一种就可以。
但是实际测试说明光使用getrawinputdata()是会丢失输入数据的。
做一个简单的测试:
第一步:WM_INPUT响应中同时使用data和buffer方法取输入数据。
可以看到data是立即获取了数据,而buffer方法获取到数据为0.
第二步:在WM_INPUT里面加上延迟Sleep(100).
现在将会发现data和buffer里面都有数据了。
现在来分析为什么会有这种情况。
以鼠标输入为例:
当我们移动鼠标的时候,鼠标会源源不断的产生数据发送给系统。此时生成WM_INPUT消息,如果消息被立即处理掉,那么新的input 消息来的时候会再产生一个wm_input
如果消息生成的速度过快,来不及处理,就像上面的例子中,每秒只能处理10个wm_input那么新的input来时就会放到buffer里面供下次获取(这里丢弃也是一种选择,但是输入设备的数据被丢弃的话,会造成卡键之类很恶心用户的结果)。
所以对使用rawinput的程序来说,最好的处理方法是2个api都要处理。
另外一个问题就是buffer里面的数据和data里面的数据顺序问题,也就是哪个数据是最后产生的?
这个问题msdn里面没有说明,测试结果,buffer里面是历史数据,data是最近的。
这个问题也会造成卡键,按下和释放键的顺序是很重要,搞反了键就卡住了。
最后一个问题:getrawinputbuffer在wow64数据对齐上面很恶心人
wow64是win64对win32的一个模拟层。如果你开发的程序是32位的,而且有可能在64位win上面用,就要多小心了。
getrawinputdata在wow64下面和win32一样,但是getrawinputbuffer对齐方式是64位的。也就是说直接使用RAWINPUT结构读数据,获得的是错误的结果,必须检测是否wow64然后做相应的处理(加上偏移)。这点msdn上面有一点提示,没看到的话找bug找死人了。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。