Delphi - 识别鼠标点击源(硬件与虚拟点击)

时间:2015-05-28 00:46:07

标签: delphi touch mouse

这次是我为找到...的标题而烦恼的事情。

我使用Windows钩子(TMOUSEHOOKSTRUCT~WH_MOUSE)来跟踪鼠标移动和鼠标按钮点击...

这一切都很好,但是,我想知道是否有办法确定鼠标移动/点击源?

如果可以通过设备ID或源类型(鼠标,轨迹球,触摸屏......)识别它,或者至少它是从硬件源发送的(也就是说,是它是硬件或一些鼠标记录器宏,或其他应用程序" SetCursor"程序)。

我在这里寻找的主要目标是找到一种方法来阻止使用鼠标记录器在我的应用程序内部进行点击(因此,在聚焦时,我开始使用鼠标钩子并且如果移动/点击是由软件完成的,我将忽略所做的任何动作。)

这可以被问为"如何在我的应用程序中阻止鼠标录制器宏"但我更愿意看到一个实际的解决方案来识别来源(以及作为主要答案),因为它也可能有其他用途。

感谢。

编辑: 一种方法是检查鼠标移动是在快照还是慢速移动(就像实际移动鼠标一样)。但是,这时触摸屏仍存在问题。 虽然,另一方面 - Windows确实检测到何时使用触摸(屏幕上的点的光标已更改),因此肯定有一种方法可以至少将鼠标与触摸事件分开 - >并且知道这已经解决了很多,结合只能拒绝鼠标上的快照动作......

1 个答案:

答案 0 :(得分:2)

Raymond Chen在this blog post

中总结了这一点
  

没有必要讨论消息的发送者是否正在玩弄伎俩和骗你的可能性,因为(1)你的程序应该跟着诡计一起回应假的[菜单]消息,好像它们是真实的[菜单] ]消息,因为(2)无论如何都无法判断你是否被骗了。

他的this blog post显示所有输入最终都通过相同的队列,因此即使Windows也不知道实际输入和模拟输入之间的区别。

您应该考虑使用Raw Input API直接从硬件接收WM_INPUT消息。 SetCursor()SendInput(),宏播放器等无法模拟这些消息。如果使用多个鼠标设备,您可以区分不同设备的输入,但不需要鼠标的类型。虽然,由于轨迹球可能比标准鼠标具有更多功能,但它可能将自身表示为HID设备而不是鼠标设备。

对于触摸屏,这种类型的输入也会生成无法模拟的WM_TOUCH消息。

因此,在WM_INPUTWM_TOUCH之间,您可以区分硬件鼠标输入和触摸屏输入,至少。除此之外,模拟输入将生成标准WM_MOUSE...WM_(L|M|R|X)BUTTON...消息,这些消息无法区分硬件输入和模拟输入,即使在较低级别的鼠标挂钩中也是如此。您可能需要跟踪WM_INPUT / WM_TOUCH消息并将其与其他消息进行匹配,如果找不到匹配,则假设正在模拟输入。