在C#中找到鼠标的速度

cae*_*say 6 c# winapi mouseevent winforms

如何在鼠标释放的确切时刻找到鼠标的瞬时垂直速度?我让用户拖动自定义控件,当他们发布时我需要知道这些信息,所以我可以使用速度的垂直分量继续他们拖动的对象...

所以,例如,如果他们以某个角度拖动,使用trig来确定垂直速度,然后使用它.

我不能随着时间的推移做距离,因为鼠标可以以不规则的速度移动,这根本不代表正确的速度.

我在想,我可以使用MouseMove的触发器之间可能有一个特定的间隔,但我不确定.

Jer*_*fin 8

如何在鼠标释放的确切时刻找到鼠标的瞬时垂直速度?

你不能.正如芝诺在几个世纪前所说的那样,速度只在一段时间内有意义.如果我必须这样做,我可能会使用加权移动平均线,所以(例如)我计算了最后5个鼠标移动消息中每一个的距离/时间,但它们的重要性随着时间的推移而"衰减".例如,我可以将最近的乘以1,将下一个乘以.8,将下一个乘以.6,依此类推.这种方式如果(例如)它们恰好在释放按钮时减慢(或加速)移动,您仍然可以此之前得到他们正在做的事情的合理近似.

  • @stefan:抱歉,但没有.速度以每单位时间的距离为单位给出.将时间减少到零时,距离也始终为零.这意味着你有0除以零,这是未定义的.最接近的数学运算是微积分,它可以让你在接近*时无限接近瞬间计算速度,但永远不会让你真正得到*到瞬时.微积分不会让你走到有不连续性的地方,这正是在这种情况下发生的事情. (2认同)

Han*_*ant 5

考虑用于调整GetMouseMovePointsEx().它可以为您提供最多64点的移动历史记录.每个点都有一个时间戳,可以准确计算速度.它可以提高您的准确性,因为时间戳不会受到鼠标移动消息缓冲在消息队列中的任何延迟的影响.并且您可以使用本机鼠标单位而不是像素获取点数.访问pinvoke.net获取声明.