Как получить абсолютную позицию мыши с настройкой WM_INPUT? - PullRequest
0 голосов
/ 29 мая 2019

Я работаю на движке Direct3D Game, я получил настройки мыши и клавиатуры из моего предыдущего проекта, но недавно столкнулся с проблемой:

Дело в том, что мой движок предназначен для игры в шутер / слешер, поэтому он требует прямого ввода, который был задан в предыдущем проекте с использованием анализа сообщений RAWMOUSE и WM_INPUT.

    case WM_INPUT:
        if (wParam == RIM_INPUT)
        {
            dword dwSize = 48;
            RAWINPUT raw;

            if (GetRawInputData((HRAWINPUT)lParam, RID_INPUT, &raw, &dwSize,
                sizeof(RAWINPUTHEADER)) != dwSize)
                OutputDebugString(TEXT("GetRawInputData does not return correct size !\n"));

            if (raw.header.dwType == RIM_TYPEMOUSE)
            {
                this->mouse.TranslateMouseInput(raw.data.mouse);
            }
            break;
        }

Проблема в том, что код возвращает только относительное движение мыши, это полезно при настройке поиска камеры, но когда дело доходит до меню или базового графического интерфейса пользователя, которые управляются мышью (кнопками и т. Д.), Дела идут плохо: GUI и другие элементы управления требуют, чтобы позиция курсора была рассчитана относительно клиентского прямоугольника.

Ближайшая вещь, которую я нашел, чтобы ответить в WinAPI - это GetCursorPos() в сочетании с GetWindowRect(), но если у окна есть строка заголовка, относительное смещение не учитывается, и координата (0,0) устанавливается в верхней части заголовка бар, но не на клиентском регионе.

Как решить проблему, не теряя относительное движение мыши?

-Можно ли попытаться проанализировать сообщения WM_MOUSEMOVE с помощью WM_INPUT?

Я искал популярное решение для ввода игровых движков, но не нашел ни одного конкретного.

Дополнительная информация :

1 Ответ

2 голосов
/ 29 мая 2019

Наилучшим вариантом, когда вам нужна абсолютная позиция мыши, является использование стандартных сообщений WM_MOUSE* и использование WM_INPUT только для относительной позиции мыши. Обычно при переходе из пользовательского интерфейса в другой режим или при переходе из относительного режима «взгляд» у вас есть переход в режим.

WM_INPUT предоставляет только относительную информацию в большинстве случаев, и если вы попытаетесь эмулировать абсолютное значение самостоятельно, вам будет не хватать баллистических указателей, которые заставляют его чувствовать себя действительно нехорошо.

Обратите внимание, что если вы хотите, чтобы ваша игра поддерживала использование через удаленный рабочий стол (как правило, для тестирования), вам нужно иметь дело с эмуляцией относительного ввода из абсолютной позиции, потому что в случае виртуального рабочего стола вы никогда не получите относительный, только абсолютный, от WM_INPUT. На это указывает MOUSE_VIRTUAL_DESKTOP.

Возможно, вы захотите взглянуть на реализацию класса Mouse в DirectX Tool Kit .

...