C++ 使用原始输入同时获取两个mice数据

C++ 使用原始输入同时获取两个mice数据,c++,winapi,mouseevent,mouse,raw-input,C++,Winapi,Mouseevent,Mouse,Raw Input,原始输入可以获得两个鼠标的数据,但是如果用户同时移动两个鼠标,似乎我只能先获取被检测鼠标的数据,而无法获取另一个鼠标的移动信息 为了获得不同鼠标的鼠标信息,我做了以下工作: PeekMessage( &msg, c_handle, WM_INPUT, WM_INPUT, PM_NOREMOVE) != 0 GetRawInputData( (HRAWINPUT)msg.lParam, RID_INPUT, lpb, &dwSize, sizeof(RAWINPUTHEAD

原始输入可以获得两个鼠标的数据,但是如果用户同时移动两个鼠标,似乎我只能先获取被检测鼠标的数据,而无法获取另一个鼠标的移动信息

为了获得不同鼠标的鼠标信息,我做了以下工作:

PeekMessage( &msg, c_handle, WM_INPUT, WM_INPUT, PM_NOREMOVE) != 0

GetRawInputData(    (HRAWINPUT)msg.lParam, RID_INPUT, lpb, &dwSize, sizeof(RAWINPUTHEADER)) != dwSize  )
因此,当偷看第一个鼠标手柄时,只有在第一个鼠标上的操作停止后才能检测到第二个鼠标

本文讨论了对能够产生大量原始输入的设备使用缓冲读取。但是这种方法本身有很多问题,应该只适用于单个鼠标(设备)上的多个输入


不确定如何在同时移动两个鼠标手柄时查看它们并获取两个鼠标数据。

可能是使用PM\u NOREMOVE造成了问题。我建议使用GetMessage()或PM_REMOVE。你所描述的应该不是问题,因为我做过类似的事情,没有这个问题


还要确保在wndproc消息末尾调用DefRawInputProc()。

因此,我仍然应该使用GetRawInputData而不是GetRawInputBuffer?两者都可以正常工作。我在实现中使用了GetRawInputData。您仍然需要调用DefRawInputProc()。我同意
PM\u NOREMOVE
是罪魁祸首。您无法窥视同一类型的多条消息,
PM\u NOREMOVE
只需窥视第一条可用消息并将其留在队列中,因此如果您再次尝试窥视,您将获得相同的消息。您必须从队列中删除该消息才能前进到下一条消息。因此,您可能根本不应该偷看消息。让您的普通消息循环正常地将消息发送到目标窗口的wndproc。我正在使用OpenSceneGraph,可能只能使用PeekMessage获取窗口上的信息。在添加GetRawInputBuffer(buffer,&dataRead,HEADERSIZE)之后;DefRawInputProc(pBuffer、dataRead、HEADERSIZE);PeekMessage之后,我的程序崩溃。只有在使用PM_REMOVE或GetMessage()将消息从队列中拉出时,才应使用DefRawInputProc