如何在Java中尽可能快地模拟鼠标点击?

时间:2015-11-01 18:59:08

标签: java mouse race-condition awtrobot

我正在模拟鼠标点击,我希望尽快完成。

目前我正在使用Robot类:

private static int milliSecondClickDelay = 25;

public static void leftClickMouse(){
    Main.robot.mousePress(InputEvent.BUTTON1_DOWN_MASK);
    Main.robot.mouseRelease(InputEvent.BUTTON1_DOWN_MASK);
    Main.robot.delay(milliSecondClickDelay);
    Main.robot.mouseMove(0, 0);
}

不幸的是我必须使用延迟,否则我会在注册发布之前鼠标移动时出现竞争条件。

25是我可以使用的最低延迟,而不会遇到这个问题,但我正在做的任务需要14秒。我以5毫秒的延迟时间缩短到6秒,但结果却非常不稳定。

我可以用另一种方式模拟点击吗?

提前致谢。

更新

我已将功能更新为:

public static synchronized void leftClickMouse(){
    Main.robot.mousePress(InputEvent.BUTTON1_DOWN_MASK);
    Main.robot.mouseRelease(InputEvent.BUTTON1_DOWN_MASK);
    Main.robot.waitForIdle();
    Main.robot.mouseMove(0, 0);
}

Robot.waitForIdle()等待,直到事件队列中当前所有事件都已处理完毕,但问题仍然存在。

1 个答案:

答案 0 :(得分:0)

我假设您的应用程序正在非Java应用程序上运行。您可能会遇到设置延迟的问题。

如果在java应用程序本身中进行此操作以与其自身进行交互,则可以使用SwingUtilies并将每个机器人操作添加到AWT线程。这可能允许您的应用程序处理鼠标按下/释放事件。

我想我们需要更多信息。您的应用程序与之交互的是什么?如果它不是应用程序本身,那么你可能会因为增加延迟而陷入困境。我会让它工作,然后将延迟增加至少20%作为安全因素。我实际上看到了什么是一致的,延迟了一倍。

根据您的操作,您可以尝试将目标应用程序的优先级设置为实时,将Java应用程序设置为任务管理器中的最低优先级。它可能会有所帮助,但它并没有解决问题。