当前位置:   article > 正文

raw input 使用上的一些陷阱_鼠标滑动后getrawinputdata数值是0

鼠标滑动后getrawinputdata数值是0

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找死人了。

 

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/木道寻08/article/detail/905871
推荐阅读
相关标签
  

闽ICP备14008679号