如何检测鼠标点击是合法还是自动?

时间:2011-02-23 13:52:31

标签: c++ vb.net

如何知道是否模拟了鼠标点击?当鼠标单击由程序或真实鼠标设备发送时

...我正在为游戏编程系统检测,以避免仅接受合法鼠标点击的机器人,自动点击等

12 个答案:

答案 0 :(得分:10)

这取决于您正在编写的应用程序类型,但如果可以,我会观察光标移动,而不是点击。 人体鼠标移动具有不均匀的速度,反应时间,不精确度(点击按钮的不同坐标等等)。

此外,您可以通过随机要求难以编写脚本的交互来防御机器人。例如:如果脚本依赖于按钮始终处于相同位置,我会确保在尝试保持直观时,每次都会在略微不同的位置弹出对话框。

否则:无法检测鼠标是真实的还是非常好的模拟鼠标。 Windows HID / MacOS / Linux驱动程序层抽象出Mice,TrackPens,TrackBalls,绘图板,触摸屏......当然还有脚本鼠标......

答案 1 :(得分:7)

虽然博客文章本身就是一个不同的问题,但我建议您使用Raymond Chen的优秀Old New Thing。在这篇特定的博客文章中,他谈到了进入应用程序的消息参数的有效性,但也指出:

  

没有必要讨论消息的发送者是否正在玩耍并欺骗你的可能性,因为(1)你的程序应该与诡计一致并回应假的菜单消息,就好像它们是真正的菜单消息一样,因为(2)无论如何也无法判断你是否被骗了。要检测说谎,你必须能够读到发给你信息的程序员的心态。

基本上,我们的论点是,您应该像点击鼠标一样响应鼠标点击,无论这些点击是如何生成的。

答案 2 :(得分:2)

mouse keys是模拟鼠标输入还是合法?模拟鼠标输入的目的是使它们看起来像真正的鼠标输入。 如果模拟正在完成其工作,则您的工作是不可能的。对不起,那就是祝福&诅咒你的软件。以下是一些不完美的想法:

  1. 使用GetKeyboardState并验证按钮状态是否正确。如果消息faker正在使用PostMessage,他们可能不会设置键盘状态,这将表明伪造。
  2. 如果您要定位正在进行输入模拟的已知应用程序,请检测它们并进行投诉。由于许多原因,这并不完美。
  3. 模糊逻辑,正如许多其他人所建议的那样。
  4. 您需要具有创造力并找出模拟事件与真实之间的区别,因为没有广泛的答案。

答案 3 :(得分:1)

问题在细节上有点薄弱。

事件可以直接发送到控件而无需移动鼠标,因此当您获得click事件并查看它是否在控件上时,找出鼠标所在的位置。键盘输入需要控制焦点,所以也要检查。

对于鼠标移动的情况,您将无法判断是否录制并播放了鼠标移动。如果它的脚本可能你可以监视控件的父面板中的鼠标行为,并使用这些事件和动作来确定它是否真实。自动点击可能无处可见,导致一系列不太可能的悬停,焦点事件。

答案 4 :(得分:1)

只有通过鼠标本身的一些专业硬件和软件才能发送实际机械点击的证据。通过软件这是不可能的。

答案 5 :(得分:1)

虽然在我的其他答案中,我提到您理想情况下只需将点击作为点击进行回复,但有一种可能性可行,具体取决于“程序化”点击的生成方式。

我假设Windows平台,由于“vb.net”标签:

使用WinAPI,您可以向任何窗口发送消息,以便模拟例如WM_LBUTTONDOWN事件。在此消息中,您将在按下按钮时包含鼠标的X和Y位置 - 或接收程序期望的位置。处理消息时,您可以使用GetCursorPos调用来获取实际的光标位置。验证当前位置接近消息中的位置,并将其作为单击处理,否则忽略它。

请记住,消息队列的性质可能需要一些时间来处理事件,并且鼠标可以在很短的时间内移动很长时间。

只有在简单的Send / PostMessage生成“click”时,此解决方案才有效。如果生成点击的应用程序也模拟了鼠标的移动,那么您应该看到其他答案:)

答案 6 :(得分:1)

无法做到(可靠(无论如何只用软件))

我已经使用WIN32API调用来读取像素/操纵鼠标/发送击键来自动化大部分视频游戏和其他重复性任务。您可以编写大量代码来分析输入,但同样聪明的开发人员只是修改他们的代码以匹配。

当我第一次尝试自动鼠标点击时,我就会这样做。发送鼠标单击。而且大部分时间都有效。您可能拥有跟踪鼠标移动的代码以及与合法点击一起发出的整个鼠标事件堆栈,并说“这不是真的 - 我们忽略它”但是没有什么能阻止开发人员实现鼠标移动。 / p>

鼠标事件比按键更复杂;但它基本上是相同的想法。如果您编写的代码可以监视按键之间的时间并确定我以完全250毫秒的间隔向您的应用程序发送“2”键,那么您可能会认为我是一个机器人。但是,我要做的就是修改我的代码,以便在250毫秒内发送击键+在-25到25毫秒之间的随机值。

这是一场永无止境的猫捉老鼠游戏。最好的解决方案是使任务变得非常简单,因此不适用简单的自动化形式。

答案 7 :(得分:0)

我不确定是否有一种方法可以完全准确地确定鼠标是否自动点击。我的意思是,您可以编写自己的USB驱动程序,它位于本机鼠标驱动程序和操作系统之间,并仅向您转发“真实”点击。然而,即使这样也可以通过插入USB设备(如智能手机)来解决,该设备被编程为将USB数据包发送到主机。

你想要实现什么,需要你区分真正的鼠标点击和假的点击?

答案 8 :(得分:0)

通过在程序中记录过去的X鼠标事件来创建统计学习解决方案。当用户点击控件时,根据最后的X操作确定概率,即实际点击。

使用真实点击和各种自动化方案训练您的解决方案。

这显然不是一种保证工作的解决方案,而且比任何其他方式更有趣。

答案 9 :(得分:0)

它比您想象的要困难得多,因为输入宏程序会为您的游戏产生合法鼠标和键盘输入消息。我认为没有办法检查输入消息是否实际由物理硬件输入(如鼠标或键盘)触发,除非OS为您提供输入驱动程序级别的可访问性。

由于这是专门针对游戏,您可以看到其他游戏如何处理这种情况。一些常见的方法是,

  1. 检查鼠标点击的频率。 (人类无法像节目一样快速点击。)

  2. 在随机点或疑点时,使用CAPTCHA进行验证。 (阅读:http://www.threadmeters.com/v-1Vvd/CAPTCHA_The_Obvious_AntiBot_Solution/

  3. 使用监视工具外部来检查计算机中运行的所有进程,以查找因作弊目的而知道的程序。蒸汽这样做。检查Valve Anti-Cheat System暴雪的魔兽世界也会对Warden做同样的事情。

  4. 我自己的建议是“使用您的游戏系统”。由于每个游戏都有自己的规则和游戏风格,因此检测玩家是否作弊并不难。这种方法不是一般的解决方案,它可能很愚蠢,但如果它适用于您的游戏,为什么不呢? :)

答案 10 :(得分:0)

您可以检查鼠标事件标志LLMHF_INJECTED和LLMHF_LOWER_IL_INJECTED或使用输入挂钩来监视鼠标输入数据,其中畸形的数据可能表明已注入了输入。

https://docs.microsoft.com/en-us/windows/win32/api/winuser/ns-winuser-msllhookstruct https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-setwindowshookexa

答案 11 :(得分:0)

有两种方法可以解决此问题。

  1. 制作一个带有文本的新按钮,以证明该用户不是AFK,并且如果用户未按该按钮,请将其踢出。在随机位置生成按钮。
  2. 如果用户不动一会儿(例如10分钟),将他或她踢出去。