raw input 使用上的一些陷阱

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

 

 

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值