Windows C - 需要想法 - 在同一应用/窗口中将鼠标输入和原始输入组合在一起



我会尽量保持最短。

我有一个应用程序多年来使用了一个鼠标输入。我希望将用户使用其他形式的输入(例如交互式投影仪,触摸设备)或几乎所有提供WM_Input消息时提供WM_INPUT消息的输入的能力。

我的总体想法是,我将使用收到的每个消息(WM__INPUT)使用原始输入(为VID/PID,设备句柄和其他信息)处理供应商ID和/或产品ID列表。在原始输入代码中未处理的任何设备都将在鼠标输入代码(WM_MOUSEMOVE,WM_LBUTTONDOWN,WM_RBUTTONDOWN等)中处理。

理想情况下,我将能够将所有鼠标输入代码保持原样或靠近它。这样,如果用户插入两只鼠标或一只鼠标和一个不支持的指向设备(这意味着我的原始输入代码无法基于VID/PID处理),则设备都将使用相同的系统光标。我的原始输入代码已知的任何设备都将得到仅在我的应用中存在的单独的光标。

问题很简单:鼠标输入没有提供有关消息源的任何信息(例如WM_MouseMove等)。知道该消息源自触摸的帮助(我已经实现了),但绝对还不够。我需要某种独特的标识符。如果我知道鼠标输入的来源,我只能从不在我已知设备列表中的设备上处理鼠标输入,并且我只能处理已知设备列表中的原始输入。

不幸的是,我似乎找不到实现这一目标的方法。

有什么想法?

感谢您的时间,对不起。

tl; dr-您可以识别Windows中鼠标输入的源(不是原始输入)吗?确定源是否触摸不够信息,我需要某种唯一的标识符。

鼠标输入-http://msdn.microsoft.com/en-us/library/windows/desktop/ff468877(v = vs.85).aspx

原始输入-http://msdn.microsoft.com/en-us/library/windows/desktop/ms645536(v = vs.85).aspx

我不知道事实后获得某种设备ID的任何API。

您可以使用WM_INPUT消息之前出现在所有其他输入消息之前的事实,当您处理WM_INPUT时,您可以使用GetRawInputDeviceInfoRIDI_DEVICENAME返回的名称的哈希来用作唯一ID。或者,您也许可以使用RAWINPUTHEADER结构的hDevice成员。

edit2:这个问题的答案是"不可能的",你做不到。不要打扰尝试,但是如果您这样做并且我错了,请解释。事实是,您不能依靠Windows始终如一地按任何特定顺序提供消息,这就是我试图做的。这让我很重要。使用原始输入(WM_INPUT)或使用鼠标消息(WM__ 鼠标)不要尝试以某种方式组合两个。

我从来没有真正得到想要的答案,但是我得到了一些有效的东西,所以我认为值得分享。

我正在做一个巨大的假设,因为我找不到Windows的任何文档来支持此假设(如果我从Windows找到文档,甚至可能真的不信任它)。据我了解,当鼠标事件以最低级别生成时,它首先作为原始输入消息(WM_INPUT)作为原始输入消息。在发布WM_Input消息后,OS获取消息并应用弹道及其在WM_*鼠标*消息发布之前所做的一切。一个巨大的假设是,此过程是序列的,因为它始终是1个WM_input消息,然后是1 WM_*鼠标*在队列中。

有了这个假设,我正在使用以下工作:收到输入消息后,将有关源设备的所有相关信息存储为"当前输入信息"收到鼠标消息后,使用"当前输入信息"作为鼠标消息来源进行处理

这使我可以独立使用n输入。

我还想补充说,根据布兰登的建议,我使用RAWINPUTHEADER结构的hDevice成员来唯一识别每个输入。由于唯一的设备可以具有多个输入,因此我还没有想出一种唯一识别每个设备的好方法。vid/pid不起作用,因为您可以拥有2个完全相同的设备,每个设备都可以插入多个输入。

请让我知道是否有人希望我详细说明!

编辑:不要将其标记为答案,因为我认为正确的答案是"不可能的"

最新更新