Необработанный ввод и ускорение курсора

В настоящее время я реализую ввод с помощью мыши, используя необработанный ввод. Недостатком является то, что баллистический указатель не включен. К сожалению, веб-сайт Microsoft, посвященный этой теме, больше не доступен в сети. Кроме того, я не могу найти функцию, извлекающую ускорение указателя, установленное в 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, значения остаются равными {6, 10, 1}, даже если я изменяю ускорение указателя в окнах.


person user1655806    schedule 26.04.2016    source источник
comment
Вы запрашиваете ускорение мыши, вызывая SystemParametersInfo с SPI_GETMOUSE параметр. Информация об ускорении мыши доступна в разделе Примечания mouse_event.   -  person IInspectable    schedule 26.04.2016


Ответы (1)


У меня есть единственная функция, которая выполняет это масштабирование для произвольной дельты (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;
}
person SonarJetLens    schedule 21.04.2017
comment
Фактически; виновата расширенная настройка движения указателя в Windows; кажется, где-то вводится другой набор модификаторов, которые не являются кривой ускорения, которую вы получаете от SPI_GETMOUSE и т. д. Я не могу найти, где это задокументировано, так что, возможно, это не так... :( - person SonarJetLens; 21.04.2017