原始输入和光标加速

时间:2016-04-26 10:18:09

标签: windows winapi raw-input

我目前正在使用Raw输入实现鼠标输入。 但缺点是,不包括指针弹道。不幸的是,微软处理这个话题的网站不再在线了。此外,我找不到一个检索Windows中指针加速度设置的函数(也许我太傻了)。

如何获得加速度以及如何使用它来计算原始x和y偏移量之外的新直观光标位置?

修改

所以关于他的评论中发表的文件IInspectable,计算加速度的代码是:

    long xPos = raw->data.mouse.lLastX;
    long yPos = raw->data.mouse.lLastY;

    int speed;
    int acceleration[3];
    SystemParametersInfo(SPI_GETMOUSESPEED, 0, &speed, 0);
    SystemParametersInfo(SPI_GETMOUSE, 0, acceleration, 0);


    if (acceleration[2] > 0 && acceleration[0] < abs(raw->data.mouse.lLastX))
        xPos *= 2;
    else if (acceleration[2] > 1 && acceleration[1] < abs(raw->data.mouse.lLastX))
        xPos *= 2;

    if (acceleration[2] > 0 && acceleration[0] < abs(raw->data.mouse.lLastX))
        yPos *= 2;
    else if (acceleration[2] > 1 && acceleration[1] < abs(raw->data.mouse.lLastX))
        yPos *= 2;


    xPos *= round((float)speed / 10.0f);
    yPos *= round((float)speed / 10.0f);

我是对的,这是如何为原始鼠标输入添加加速度的?

奇怪的是,当我使用SystemParametersInfo和SPI_GETMOUSE检索加速时,即使我在Windows中更改指针加速度,值也会保持在{6,10,1}。

1 个答案:

答案 0 :(得分:0)

我有一个函数可以执行此缩放,对于任意delta(dq),它与您的类似。但是,我的经验是Windows加速和指针增强,特别是在考虑到DPI感知时,会使RAWINPUT与相应的WM_MOUSEMOVE之间的映射非常棘手......

int ApplyMouseAcceleration(int dq)
{
    auto absdq{ abs(dq) };
    // based on https://msdn.microsoft.com/en-us/library/windows/desktop/ms646260(v=vs.85).aspx
    if (MouseAccelerationparams[0] && absdq > MouseAccelerationparams[0])   
    {
        dq *= 2;
        if ((absdq > MouseAccelerationparams[1]) && (MouseAccelerationparams[2] == 2))
        {
            dq *= 2;
        }                                       
    }
    dq = (dq*MouseSpeed) / 10;
    return dq;
}