向应用程序发送击键,SendKeys.Send()与SendMessage()
本文关键字:Send SendMessage SendKeys 应用程序 | 更新日期: 2024-07-23 08:21:14
我创建了一个简单的机器人来自动化游戏中的一些事情。我目前通过将游戏窗口放在前台并使用SendKeys发送密钥来向游戏发送命令,如下所示:
SendKeys.Send("{ENTER}")
我想知道的是,从可检测性的角度来看,反作弊引擎等是否更容易检测到这样的东西(使用SendMessage):
public static void SendKeystroke(ushort k)
{
const uint WM_KEYDOWN = 0x100;
const uint WM_SYSCOMMAND = 0x018;
const uint SC_CLOSE = 0x053;
IntPtr WindowToFind = FindWindow(null, "Untitled1 - Notepad++");
IntPtr result3 = SendMessage(WindowToFind, WM_KEYDOWN,
((IntPtr)k), (IntPtr)0);
}
SendKeystroke(Keys.Enter);
最后,游戏会收到一个回车键非暂停的keydown事件,对吧?
- CCD_ 1通常使用CCD_。基于日志挂钩的替代方法在UAC中是不可行的,所以让我们假设
SendKeys.Send
解析为SendInput
SendMessage
以同步方式将消息直接传递到窗口进程
所以,哪个更容易检测。当然,答案是SendMessage
。这些是到达窗口过程的输入消息,而从未通过调用GetMessage
从队列中拉出。这很容易察觉。您只需记录从队列中提取的最新消息的一些信息,然后在窗口过程中,根据最新排队的消息检查消息。
现在,区分SendInput
和真实的人类输入可能比这更难。不过我很确定这是可能的。一种方法是安装一个低级键盘挂钩并查找LLKHF_INJECTED标志。更难,但没有那么难。
这既是一个概念问题,也是一个技术问题。
-
SendKeys.Send()-是WinAPI SendInput()函数的Windows窗体包装器。此功能可直接与鼠标和键盘输入流配合使用。尽管有一些限制(请阅读相关文档)。
-
SendMessage()-是一个WinAPI函数。它用于向窗口发送特定消息。除了鼠标或键盘输入之外,它还可以用于发送其他消息。这是一种更高级别的消息队列,许多其他消息在其中聚合,并发送到窗口。在进程之间封送消息也有限制。
-
可检测性:这实际上取决于你能在多大程度上模拟按下按钮的过程,以及你所面对的反作弊引擎有多好。当一个人按下按钮时,几乎没有其他信息发送到窗口。除了WM_KEYDOWN,还有WM_KEYUP和其他一些。您的任务是尽可能地重新创建该序列。你必须对这个话题进行自己的研究。您已经可以看到,人类按下按钮,不可能创建只有WM_KEYDOWN被发送到窗口的情况,WM_KEYUP必须跟进。此外,两者之间的延迟应该是人为可能的,等等…
我还认为,SendMessage()可能无法像预期的那样与游戏一起工作,因为其中许多游戏使用DirectX DirectInput,在这种情况下,我认为WinAPI SendInput()函数可以做得更好,因为它是一个较低级别的API,并直接与输入流一起工作。