2015-11-01 101 views
1

我模拟鼠标点击,我想尽可能快地做到这一点。如何在Java中尽可能快地模拟鼠标点击?

目前我使用机器人类本:

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()等待,直到目前的事件队列中的所有事件被处理,但问题依旧那里。

+0

我想你可以使用本地代码在操作系统的系统消息队列中排列鼠标点击消息。我不知道如何在我自己的操作系统,Windows中做到这一点,更不用说所有其他人。 –

回答

0

我假设你的应用程序是在非Java应用程序上进行操作。您可能会因设置延迟而停滞不前。

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

我想我们需要更多的信息。你的应用程序与什么进行交互?如果它不是应用程序本身,那么您可能会因为延迟而停滞不前。我会把它运行起来,然后延迟至少20%作为安全因素。我实际上会看到一致的工作,并延迟两倍。

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