我创建了一个简单的机器人来自动完成游戏中的某些操作。我目前正在通过将游戏窗口置于前台并使用SendKeys发送键来向游戏发送命令,如下所示:

SendKeys.Send("{ENTER}")

从可检测性的角度来看,我想知道的是,反 Cheat Engine 是否更容易检测到这样的东西(使用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);

最后,游戏仍然会收到Enter键的keydown事件,对吧?

最佳答案

  • SendKeys.Send通常使用SendInput。基于日记帐 Hook 的替代方法在UAC中不可行,因此让我们假设SendKeys.Send解析为SendInput
  • SendMessage以同步方式将消息直接传递到窗口proc。

  • 因此,这更易于检测。好吧,可以肯定的答案是SendMessage。这些是到达窗口过程的输入消息,而从未通过调用GetMessage退出队列。这很容易检测。您只需记录一些有关从队列中提取的最新消息的信息,然后在窗口过程中,根据最新的排队消息检查该消息。

    现在,区分SendInput和真实的人类输入可能比这难得多。我非常确定这是有可能的。一种方法是安装低级键盘 Hook 并查找LLKHF_INJECTED标志。更难,但要难得多。

    关于c# - 将击键发送到应用程序SendKeys.Send()与SendMessage(),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20424182/

    10-10 15:35