加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 向应用程序发送击键,SendKeys.Send()vs SendMessage()

发布时间:2020-12-15 08:03:16 所属栏目:百科 来源:网络整理
导读:我创建了一个简单的机器人来自动化游戏中的一些东西.我目前通过将游戏窗口带到前台并使用 SendKeys发送密钥来向游戏发送命令,如下所示: SendKeys.Send("{ENTER}") 我想知道的是,从可检测性的角度来看,如果反作弊引擎更容易检测到这样的东西(使用SendMessage
我创建了一个简单的机器人来自动化游戏中的一些东西.我目前通过将游戏窗口带到前台并使用 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事件,对吧?

解决方法

> SendKeys.Send通常使用SendInput.基于日志挂钩的替代方法对于UAC是不可行的,因此我们假设SendKeys.Send解析为SendInput.
> SendMessage以同步方式将消息直接传递给窗口过程.

因此,这更容易检测.好吧,肯定答案是SendMessage.这些是到达窗口过程的输入消息,而没有通过调用GetMessage从队列中取出.这很容易被发现.您只需记录有关从队列中提取的最新消息的一些信息,并在窗口过程中,根据最新排队的消息检查消息.

现在,区分SendInput和真实的人类输入可能比这更难.我很确定这是可能的.一种方法是安装低级键盘钩子并查找LLKHF_INJECTED标志.更难,但不是那么难.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读