RAWINPUT-如何获取鼠标滚轮数据 [英] RAWINPUT - How to get Mouse Wheel data

查看:481
本文介绍了RAWINPUT-如何获取鼠标滚轮数据的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在将rawinput与directx一起使用...我试图在使用鼠标滚轮时使用摄像机进行缩放...当我使用以下代码运行程序时,我从rawinput获得的用于usbuttondata的数据当我向前推动鼠标滚轮到120时...然后失去控制...直到65000 ...我认为数据应该是1或-1或0 ... rawinput作为鼠标发送的内容车轮数据?

I'm using rawinput with directx...i'm trying to zoom with the camera when mouse wheel is used...when I run the program with the following code, the data I get from rawinput for the usbuttondata goes to 120 when I push mouse wheel forward...then it goes out of control...up to 65000...I thought the data was supposed to be 1 or -1 or 0...what does rawinput send as the mouse wheel data?

代码:

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;
    }
}


推荐答案

I怀疑它与WM_MOUSEWHEEL相同:

I suspect it is the same as WM_MOUSEWHEEL:

高阶字表示车轮旋转的距离,以WHEEL_DELTA的倍数或分度表示,为120。正值指示轮子向前旋转,远离用户;负值表示方向盘朝着用户向后旋转。
低位单词指示各种虚拟键是否按下。

The high-order word indicates the distance the wheel is rotated, expressed in multiples or divisions of WHEEL_DELTA, which is 120. A positive value indicates that the wheel was rotated forward, away from the user; a negative value indicates that the wheel was rotated backward, toward the user. The low-order word indicates whether various virtual keys are down.

因此,您需要提取高位单词。您需要注意正确处理负值。

Therefore you need to extract the high order word. You need to take care to handle negative values correctly. You probably don't as you get large values instead.

如果需要,可以为此使用以下宏:GET_WHEEL_DELTA_WPARAM(wParam)

If you want you can use the following macro for this: GET_WHEEL_DELTA_WPARAM(wParam)

这篇关于RAWINPUT-如何获取鼠标滚轮数据的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆