首页 > 解决方案 > 如何检测进程是否移动了鼠标光标而不是用户?

问题描述

可以通过调用mouse_event 函数或使用System.Windows.Forms.Cursor.Position属性来移动鼠标。我想知道的是,是否有可能知道使用我的软件的用户是否正在使用这些方法之一。

我知道可以检查用户的鼠标移动,例如,查看它是否发生得太快。但是我想知道是否还有其他更准确的方法,例如检查是否正在调用某个 WinApi 函数。

当鼠标被物理移动时,会触发 mouse_event 函数吗?

或者对 mouse_event 函数的调用是否会进行另一个系统调用并调用“物理鼠标移动”使用的实际函数?

标签: c#winformswinapimouseevent

解决方案


可以使用 API 调用SendInput()mouse_event(). 为此,请使用SetWindowsHookEx()设置低级鼠标挂钩。这个钩子过程被传递了一个MSLLHOOKSTRUCT,它的flags成员指示鼠标事件是由代码注入的结果,还是用户输入的结果。

如果攻击者正在向您的应用程序发送鼠标消息,您可以从鼠标消息处理程序中调用InSendMessage 。真正的鼠标消息发布到消息队列。通常会发送假鼠标消息。如果InSendMessage返回TRUE,您可以确定收到了虚假的输入消息。如果攻击者确实发布了消息,您将不得不依靠识别实际输入设备状态和预期状态之间的不匹配。GetKeyState可用于此。

没有直接的方法来检测对SetCursorPos. 单独来看,这些调用不会生成用户输入,也不能用于自动化应用程序。它们总是伴随着其他注入输入的方案,你知道如何识别它们。


推荐阅读