【问题标题】:To get two mice data the same time by using Raw Input使用原始输入同时获取两个鼠标数据
【发布时间】:2014-10-15 15:15:30
【问题描述】:

原始输入可以得到两个鼠标的数据,但是如果用户同时移动了两个鼠标,我好像只能得到先检测到的鼠标的数据,而不能得到另一个鼠标的移动信息。

为了获取不同鼠标的鼠标信息,我是这样做的:

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

GetRawInputData(    (HRAWINPUT)msg.lParam, RID_INPUT, lpb, &dwSize, sizeof(RAWINPUTHEADER)) != dwSize  )

所以,当第一个鼠标手柄被窥视时,只有在第一个鼠标的操作停止后才能检测到第二个鼠标。

msdn 谈到了将缓冲读取用于可以产生大量原始输入的设备。但是这种方法本身有很多问题,应该只适用于单个鼠标(设备)上的多个输入

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

【问题讨论】:

    标签: c++ winapi mouseevent mouse raw-input


    【解决方案1】:

    也许使用 PM_NOREMOVE 会导致问题。我建议使用 GetMessage() 或 PM_REMOVE。您所描述的应该不是问题,因为我做过类似的事情并且没有遇到这个问题。

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

    【讨论】:

    • 那么,我还是应该使用 GetRawInputData 而不是 GetRawInputBuffer ?
    • 两者都应该可以正常工作。我在实现中使用了 GetRawInputData。您仍然需要调用 DefRawInputProc()。
    • 我同意PM_NOREMOVE 是罪魁祸首。您无法查看同一类型的多条消息,PM_NOREMOVE 只是查看第一条可用消息并将其留在队列中,因此如果您再次尝试查看,您将收到相同的消息。您必须从队列中删除该消息才能前进到下一条消息。就此而言,您可能根本不应该偷看消息。让您的正常消息循环将消息正常发送到目标窗口的 wndproc。
    • 我用的是OpenSceneGraph,可能只能用PeekMessage来获取窗口的信息。并在添加 GetRawInputBuffer(buffer, &dataRead, HEADERSIZE); DefRawInputProc(pBuffer, dataRead, HEADERSIZE);在 PeekMessage 之后,我的程序崩溃了。
    • 只有在使用 PM_REMOVE 或 GetMessage() 将消息从队列中拉出时,才应使用 DefRawInputProc
    猜你喜欢
    • 1970-01-01
    • 2023-02-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多