【问题标题】:How to simulate mouse clicks as fast as possible in Java?如何在 Java 中尽可能快地模拟鼠标点击?
【发布时间】:2015-11-01 18:59:07
【问题描述】:

我正在模拟鼠标点击,我想尽可能快地做到这一点。

目前我正在使用 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 秒。我已经缩短到 6 秒,延迟了 5 毫秒,但结果非常不一致。

我可以通过其他方式模拟点击吗?

提前致谢。

更新:

我已将函数更新为:

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() 会一直等待,直到当前事件队列中的所有事件都已处理完毕,但问题仍然存在。

【问题讨论】:

  • 我想您可以使用本机代码在操作系统的系统消息队列中对鼠标单击消息进行排队。我对如何在我自己的操作系统 Windows 中执行此操作一无所知,更不用说其他所有操作系统了。

标签: java mouse race-condition awtrobot


【解决方案1】:

我假设您的应用程序正在对非 Java 应用程序进行操作。您可能会被设置延迟所困扰。

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

我想我们需要更多信息。您的应用程序与什么交互?如果不是应用程序本身,您可能会遇到添加延迟的问题。我会让它工作,然后将延迟增加至少 20% 作为安全因素。我实际上会看到什么是始终如一的工作并将延迟加倍。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-21
    • 2017-04-17
    • 1970-01-01
    • 2017-01-03
    相关资源
    最近更新 更多