首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SendInput()鼠标运动计算?

SendInput()鼠标运动计算?
EN

Stack Overflow用户
提问于 2020-02-17 19:06:25
回答 2查看 551关注 0票数 1

我在玩SendInput()的鼠标运动,它需要INPUT结构。我使用的是相对运动,在关于这个结构的文档中,它在注释中说:

鼠标相对运动受鼠标速度和双鼠标阈值的影响.

所以我的问题是,这是如何计算的(公式是什么)?没有具体说明。

我试过寻找,但没有运气。希望有人知道。

我需要这些信息,因为我试图使鼠标运动独立于实际的Windows光标速度。在文档中,它清楚地表示这受到这些值的影响。

EN

回答 2

Stack Overflow用户

发布于 2020-03-02 03:48:55

  • 相对值

鼠标相对运动受鼠标速度和双鼠标阈值的影响.所以我的问题是,这是如何计算的(公式是什么)?没有具体说明。

如何计算在结构文件中说明如下:

系统对指定的相对鼠标运动进行两次测试。如果指定的沿x或y轴的距离大于第一个鼠标阈值,且鼠标速度不是零,则系统会将距离加倍。如果沿x或y轴的指定距离大于第二个鼠标阈值,且鼠标速度等于2,则系统将应用第一个阈值测试产生的距离加倍。因此,系统可以将指定的相对鼠标沿x或y轴的运动乘以4倍。

例如,为了防止系统将指定的相对鼠标沿x或y轴的移动加倍或乘以指定的相对鼠标移动4倍,您可以使指定的相对鼠标移动小于或等于第一个鼠标阈值,并将鼠标速度设置为零。请测试这是否符合您的要求。

至于UIPI限制,因为您的应用程序已经作为管理员权限运行,所以它具有很高的强制级别,因此除非目标应用程序以系统完整性水平的形式运行,否则这不会是一个问题。

  • 绝对值

并且没有UIPI限制,您还可以使用绝对值,它不受鼠标速度和双鼠标阈值的影响。

票数 0
EN

Stack Overflow用户

发布于 2022-05-31 11:15:19

来自函数的文档

鼠标的相对运动取决于鼠标速度和加速度的设置。最终用户使用控制面板中的鼠标应用程序设置这些值。应用程序使用SystemParametersInfo函数获取并设置这些值。

我相信这些问题涉及以下两个问题:

  • SPI_GETMOUSE (= 0x0003) 检索两个鼠标阈值和鼠标加速。pvParam参数必须指向接收这些值的三个整数数组。

这三个值是第一个阈值、第二个阈值和加速值。

  • SPI_GETMOUSESPEED ( = 0x0070) 检索当前鼠标速度。鼠标速度根据鼠标移动的距离决定指针移动的距离。pvParam参数必须指向一个整数,该整数接收的值介于1(最慢)到20 (最快)之间。默认值为10。

这似乎遵循了一个有点奇怪的公式来扩展运动。

当应用加速度时,系统对指定的相对鼠标运动进行两次测试。如果指定的沿x或y轴的距离大于第一个鼠标阈值,且鼠标加速级别不是零,操作系统就会将距离加倍。如果沿x轴或y轴的指定距离大于第二个鼠标阈值,且鼠标加速级别等于2,操作系统将应用第一个阈值测试产生的距离加倍。因此,操作系统可以将相对指定的鼠标沿x轴或y轴的运动乘以4倍。

不幸的是,我无法破解这个问题(当在“鼠标属性”中启用“增强指针精度”时,它适用)。它显然并不仅仅是价值的两倍。

对于比阈值高三倍的值,缩放似乎是准确的(它使您的输入加倍),但除此之外,2的因子一直在增长。这些测试的鼠标速度为10:

  • 对于你输入的20,最后的旅行距离是40。
  • 对于40,最终距离是93,而不是80 (~1.16以上)。
  • 对于80,最终距离是201,而不是160 (~1.25以上)。
  • 对于160,最终距离是416,而不是320 (~1.30以上)。
  • 对于320,最终距离是846,而不是640 (~1.32以上)。
  • 对于较高的数值,实际/预期的比率几乎没有增长。

更糟糕的是,速度为20 (假设后面描述的速度缩放是相同的):

  • 对于你输入的20,最后的行程是66。
  • 对于40,最终距离是173,而不是280 (~0.62下)。
  • 对于80,最终距离是388,而不是560 (~0.69下)。
  • 对于160,最终距离是416,而不是320 (~0.73以下)。
  • 对于320,最终距离是1677,而不是2240 (~0.75以上)。
  • 对于更高的值,我的监视器不够大。

一旦应用了加速,系统将按所需的鼠标速度缩放结果值。鼠标速度可以从1(最慢)到20 (最快)不等,并根据鼠标移动的距离来表示指针移动了多少。默认值为10,因此不会对鼠标运动进行任何额外的修改。

从我的测试,它看起来10个意味着没有缩放(刻度1)。每一个高于10的值似乎都会使比例尺因子增加1/4,而低于10的值则会降低1/8 (除了2的值达到0,因此标度为1/16,1单位的标度似乎为0/32)。如果禁用“增强指针精度”,下面的算法(Python)预测鼠标的结束位置:

代码语言:javascript
复制
import ctypes

speed = ctypes.c_int()
ctypes.windll.user32.SystemParametersInfoA(0x0070, 0, ctypes.byref(speed), 0)  # SPI_GETMOUSESPEED
speed = out.value

# x is how much you want to move the mouse in the x axis (the same is true for the y axis)

if speed == 1:
    predict_x = x // 32
elif speed == 2:
    predict_x = x // 16
elif speed <= 10:
    predict_x = (x * (speed - 2)) // 8
else:
    predict_x = (x * (speed - 6)) // 4

如果您想准确地移动鼠标x,则需要反向代码:

代码语言:javascript
复制
if speed == 1:
    used_x = x * 32
elif speed == 2:
    used_x = x * 16
elif speed <= 10:
    used_x = int(round((x * 8) / (speed - 2)))
else:
    used_x = int(round((x * 4) / (speed - 6)))

我的结论是,用相对运动来精确地移动鼠标是不值得的。最好查询当前位置,添加增量,并设置绝对位置。否则,您必须查询鼠标的配置,可以随时更改,并设计为良好的感觉,而不是精确的一个动作。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60268940

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档