6

我正在使用 .java 在 java 中创建一个机器人java.awt.Robot。该机器人在浏览器上运行良好(我也使用 Microsoft Word 对其进行了测试!)但是当我在游戏中运行它时,唯一有效的功能是mouseMove. 我想构建一个简单地为我按下键盘按钮的机器人。

我实例化机器人类

Robot r = new Robot();

然后我做一些简单的事情:按z,按1,移动鼠标并单击鼠标右键。

r.keyPress(KeyEvent.VK_Z);
r.keyRelease(KeyEvent.VK_Z);

r.keyPress(KeyEvent.VK_1);
System.out.println("Press 1 button");
r.keyRelease(KeyEvent.VK_1);
System.out.println("Release 1 button");
r.delay(1000);

System.out.println("Move mouse");
r.mouseMove(110, 690);

System.out.println("Press");
r.mousePress(InputEvent.BUTTON3_MASK);
System.out.println("Release");
r.mouseRelease(InputEvent.BUTTON3_MASK);

为什么会这样?如果这个机器人类在后台运行,它可以在游戏中执行这些动作吗?

谢谢

更新:例如,如果我在 PES 2012 上运行我的机器人,它工作正常,但如果我在像阴谋集团这样的在线游戏上运行它,它就不起作用?游戏的保护系统没有检测到任何东西,所以情况并非如此。

4

3 回答 3

4

首先,大多数游戏都有机器人保护,所以一定要给机器人添加延迟,也许还有一个“冷却时间”。在该r.delay(1000)声明之前,机器人做了两个即时动作。

我几乎可以肯定它不起作用,因为击键速度太快了:它们会立即按下并释放。在实例化 Robot 类之后尝试添加bot.delay(500)(或更多,取决于游戏);在所有按键功能之前。这会在机器人完成的所有动作之间增加 500 毫秒的延迟。

public static void doStuff() {

    Robot r = new Robot();

        r.delay(500); //Or more - depends on the game

        r.keyPress(KeyEvent.VK_Z);
        r.keyRelease(KeyEvent.VK_Z);

        r.keyPress(KeyEvent.VK_1);
        System.out.println("Press 1 button");
        r.keyRelease(KeyEvent.VK_1);
        System.out.println("Release 1 button");
        r.delay(1000);

        System.out.println("Move mouse");
        r.mouseMove(110, 690);

        System.out.println("Press");
        r.mousePress(InputEvent.BUTTON3_MASK);
        System.out.println("Release");
        r.mouseRelease(InputEvent.BUTTON3_MASK);
}

我认为 Z 和 1 键不起作用的唯一原因是一切完成的速度。游戏可能有一个反机器人系统。

于 2012-12-22T03:38:24.823 回答
1

这很大程度上取决于它是什么类型的游戏。如果代码只是模拟键盘操作等系统输入。它应该看起来像一个普通人。

然而从它的样子来看。从你的例子。它以闪电般的速度运行,因此它可能根本没有检测到输入,和/或反机器人措施对你试图机器人的所谓游戏进行了测量。正在阻塞输入。将延迟混合在一起。看看是否有帮助。我会回来寻求更多帮助。这点我不专业。但这是我最好的猜测。

编辑:

当我的意思是延迟在触发按键事件之前放置一个延迟。这样它就有时间处理按键。

于 2012-09-06T19:46:32.897 回答
0

您的代码可能在游戏中太快地按下和释放键。经常有游戏要求您至少延迟 40 毫秒至 80 毫秒来按下和释放键。尝试这个应该会有所帮助 -

public static void doSomething() throws Exception{
    Robot rbt = new Robot();
    int typingTimes = 20;
    while(timer-- > 0){
        rbt.keyPress(KeyEvent.VK_1);
        //You can use Thread.sleep() after each keyPress to increase the delay
        Thread.sleep(500);
        rbt.keyRelease(KeyEvent.VK_1);
        
        rbt.keyPress(KeyEvent.VK_Z);
        //You can use Robot's delay() method after each keyPress too
        rbt.delay(500);
        rbt.keyRelease(KeyEvent.VK_Z);
    }
}

希望这可以帮助!

于 2020-06-23T18:51:02.297 回答