RAWINPUT - Как получить данные колесика мыши - PullRequest
2 голосов
/ 12 февраля 2012

Я использую rawinput с DirectX ... Я пытаюсь увеличить масштаб с камерой, когда используется колесо мыши ... Когда я запускаю программу со следующим кодом, данные, которые я получаю из rawinput для usbuttondata, отправляютсядо 120, когда я нажимаю колесо мыши вперед ... затем оно выходит из-под контроля ... до 65000 ... Я думал, что данные должны быть равны 1 или -1 или 0 ... что отправляет rawinput как мышьданные колеса?

код:

LRESULT CALLBACK WndProc(HWND hWnd, UINT Msg,
                             WPARAM wParam, LPARAM lParam)
{
    switch(Msg)
    {
        case WM_CREATE:
            {
                RAWINPUTDEVICE Rid[2];
                // Keyboard
                Rid[0].usUsagePage = 1;
                Rid[0].usUsage = 6;
                Rid[0].dwFlags = 0;
                Rid[0].hwndTarget=Inst.Wnd.hWnd;

                // Mouse
                Rid[1].usUsagePage = 1;
                Rid[1].usUsage = 2;
                Rid[1].dwFlags = 0;
                Rid[1].hwndTarget=Inst.Wnd.hWnd;
                if (!RegisterRawInputDevices(Rid,2,sizeof(RAWINPUTDEVICE)))
                {
                    MessageBox(NULL, L"Failed to Register Input Devices!", L"ALERT", MB_OK);
                    exit(1);
                }
                return 0;
            }
        case WM_INPUT:
            {               
                // Determine how big the buffer should be
                UINT iBuffer;

                GetRawInputData((HRAWINPUT)lParam, RID_INPUT, NULL, &iBuffer,
                    sizeof(RAWINPUTHEADER));
                LPBYTE lpb = new BYTE[iBuffer];
                if (lpb == NULL)
                {
                    return 0;
                } 

                UINT readSize = GetRawInputData( (HRAWINPUT)lParam, RID_INPUT, lpb, &iBuffer, sizeof(RAWINPUTHEADER) ) ;

                if( readSize != iBuffer )
                    puts( "ERROR:  GetRawInputData didn't return correct size!" ) ;
                RAWINPUT *raw = (RAWINPUT*) lpb;                

                if (raw->header.dwType== RIM_TYPEMOUSE)
                {
                    riProcessMouseMessage(&raw->data.mouse);
                }
                if (raw->header.dwType== RIM_TYPEKEYBOARD)
                {
                    //riProcessKeyboardMessage(&raw->data.keyboard);
                }               
            }
            return 0;

        case WM_COMMAND:
            switch(LOWORD(wParam))
            {
                case IDM_FILE_NEW:
                {
                    // Create the game object
                    pGame = new CGame(dxMgr.getD3DDevice());

                    // Initialize the game object
                    if (!pGame->init(Inst.Wnd.hWnd))
                        return 0;
                    break;
                }
                case IDM_FILE_OPEN:
                    pGame->m_animCollection->LoadXFile("oxana.x", 0);
                    //objects.CreateNewObject(1, L"oxana.x", NULL);
                    break;

                case IDM_FILE_SAVE:

                    break;

                case IDM_FILE_SAVEAS:
                    break;

                case IDM_FILE_EXIT:
                    PostQuitMessage(WM_QUIT);
                    break;
            }
            return 0;

        case WM_DESTROY:
            PostQuitMessage(WM_QUIT);
            return 0;

        default:
            return DefWindowProc(hWnd, Msg, wParam, lParam);
    }
    return TRUE;
}

void riProcessMouseMessage( const RAWMOUSE* rmouse )
{
    if(pGame != NULL)
    {
        //MessageBox(NULL, L"Game Found", L"SUCCESS", MB_OK);
        if ( MOUSE_MOVE_RELATIVE == rmouse->usFlags )   
        {
            riMgr.mxr = &rmouse->lLastX;        
            riMgr.myr = &rmouse->lLastY;    
        }
        riMgr.mzr = (RI_MOUSE_WHEEL & rmouse->usButtonFlags) ? &rmouse->usButtonData : 0;
    }
}

1 Ответ

6 голосов
/ 12 февраля 2012

Я подозреваю, что это то же самое, что и WM_MOUSEWHEEL:

Старшее слово указывает расстояние, на которое вращается колесо, выраженное в кратных или делительных единицах WHEEL_DELTA, равном 120. Положительное значение указывает, что колесобыл повернут вперед, от пользователя;отрицательное значение указывает, что колесо было повернуто назад, к пользователю.Слово младшего разряда указывает, не работают ли различные виртуальные ключи.

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

Если вы хотите, вы можете использовать для этого следующий макрос: GET_WHEEL_DELTA_WPARAM (wParam)

...