Как получить движение мыши, когда курсор заблокирован на экране

0

У меня есть приложение (игра), где мне нужно, чтобы курсор был скрыт, так как игрок должен управлять объектом с помощью мыши. Мне также пришлось заблокировать курсор (установить среднюю позицию экрана с помощью SetCursorPos в обработчике mousemove).

Есть ли жизнеспособное и простое решение для отслеживания движений мыши?

Прямо сейчас у меня есть грязный взломать значение bool, которое позволяет мне игнорировать следующий обработчик событий сразу после вызова метода SetCursorPos. Но мне это не нравится, и это не работает должным образом - мышь не точная.

Увы, я не могу использовать DirectInput в этом проекте.

Теги:

1 ответ

0
Лучший ответ

Я использовал GetRawInputData вместо координат экрана мыши. Оно работало завораживающе.

В обработчике событий

LRESULT CALLBACK Application::StaticWndProc( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam )
...
case WM_INPUT: 
{
    UINT dwSize = 40;
    static BYTE lpb[40];

    GetRawInputData((HRAWINPUT)lParam, RID_INPUT, 
                    lpb, &dwSize, sizeof(RAWINPUTHEADER));

    RAWINPUT* raw = (RAWINPUT*)lpb;

    if (raw->header.dwType == RIM_TYPEMOUSE) 
    {
        int xPosRelative = raw->data.mouse.lLastX;
        int yPosRelative = raw->data.mouse.lLastY;
        GameState::Instance()->MoveCursor(xPosRelative, yPosRelative);
        RECT rect;
        //resetting cursor to stay in center
        if(GetWindowRect(Application::Instance()->m_hWnd, &rect))
            SetCursorPos((rect.right - rect.left) / 2, (rect.bottom - rect.top) / 2);
    } 
    break;
}
  • 0
    Вы забыли объяснить, как заставить его отправлять необработанные входные данные RegisterRawInputDevices и не проверяете, установлен ли флаг MOUSE_MOVE_ABSOLUTE . также вам не нужен массив BYTE. Вы можете просто использовать RAWINPUT и sizeof () его. и это тоже необработанный вклад. нет баллистического движения, которое пользователи знают и ожидают.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню