У меня есть приложение (игра), где мне нужно, чтобы курсор был скрыт, так как игрок должен управлять объектом с помощью мыши. Мне также пришлось заблокировать курсор (установить среднюю позицию экрана с помощью SetCursorPos в обработчике mousemove).
Есть ли жизнеспособное и простое решение для отслеживания движений мыши?
Прямо сейчас у меня есть грязный взломать значение bool, которое позволяет мне игнорировать следующий обработчик событий сразу после вызова метода SetCursorPos. Но мне это не нравится, и это не работает должным образом - мышь не точная.
Увы, я не могу использовать DirectInput в этом проекте.
Я использовал 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;
}
RegisterRawInputDevices
и не проверяете, установлен ли флагMOUSE_MOVE_ABSOLUTE
. также вам не нужен массив BYTE. Вы можете просто использовать RAWINPUT и sizeof () его. и это тоже необработанный вклад. нет баллистического движения, которое пользователи знают и ожидают.