2013-01-01 72 views
1

我使用winapi的原始输入设备进行鼠标输入,看起来我没有在我的RAWMOUSE结构中获得正确的值。原始输入设备RAWMOUSE使用

当我拿到RAWMOUSE结构,我得到lLastXlLastY如我期望的值,但由于某些原因,ulRawButtons是不断0 MSDN文档说,ulRawButtons是“的原鼠标按钮的状态“所以我认为这应该改变,当我按下鼠标按钮。

这是我创建与原始输入装置的代码(I移除错误检查的可读性):

void handleRawInput(HWND window, UINT, WPARAM wParam, LPARAM lParam) 
{ 
    RAWINPUT input; 
    UINT szData = sizeof(input), szHeader = sizeof(RAWINPUTHEADER); 
    HRAWINPUT handle = reinterpret_cast<HRAWINPUT>(lParam); 

    GetRawInputData(handle, RID_INPUT, &input, &szData, szHeader); 
    if (input.header.dwType == RIM_TYPEMOUSE) 
    { 
     // Here input.data.mouse.ulRawButtons is 0 at all times. 
    } 
} 

我:

RAWINPUTDEVICE rid; 
rid.usUsagePage = 0x01; 
rid.usUsage  = 0x02; 
rid.dwFlags  = RIDEV_INPUTSINK; 
rid.hwndTarget = myWindowHandle; 
RegisterRawInputDevices(&rid, 1, sizeof(rid)); 

WM_INPUT消息我打电话后使用mingw32(4.7)和我已经定义WIN32_LEAN_AND_MEANWINVER = 0x0501WIN32_WINNT = 0x0501

任何想法,为什么我没有得到ulRawButtons的正确值?

+0

该值直接来自设备驱动程序。也许你有一个古怪的依赖于使用usButtonFlags的Windows。 –

+0

来自Microsoft MSDN网站的演示代码,主题为“使用原始输入”,网址为https://msdn.microsoft.com/en-us/library/ms645546(v=vs.85).aspx提供了两个键盘的示例和鼠标,作为@Sean Cline在他的回答中提到,我在Win32窗口应用程序中使用这个演示代码显示'data.mouse.ulButtons'和'data.mouse.usButtonFlags'都会随着我点击鼠标垫按钮而改变值然而,我的笔记本电脑'data.mouse.ulRawButtons'似乎总是为零。 –

回答

2

Windows使用鼠标驱动程序通过MOUSE_INPUT_DATA结构告诉它的结构填充了RAWMOUSE结构。

你会发现MSDN pageMOUSE_INPUT_DATA状态如下:

RawButtons

指定鼠标按钮的原始状态。 Win32子系统不使用此成员。

什么MSDN页面不说的是,不仅Win32的不使用RawButtons/ulRawButtons但鼠标驱动程序在发货不填充它们。所以,除非你有第三方厂商的鼠标驱动程序,否则你永远不会得到这个字段集。

我认为你要使用的是:input.data.mouse.usButtonFlags为鼠标点击和input.data.mouse.usButtonData为滚轮三角洲。

+0

感谢您的回复,我的印象是usButtonFlags显示了差异,ulRawButton显示了当前状态。 –