Java:Thread.sleep mousepress延迟

时间:2016-06-15 06:54:44

标签: java

我一直在尝试使用jnativehook在java中创建一个autoclicker。 它工作正常,甚至编译和运行。我的问题是使用Thread.sleep尝试在点击之间添加延迟:

bot.mousePress(InputEvent.BUTTON1_MASK);
Thread.sleep(50);
bot.mouseRelease(InputEvent.BUTTON1_MASK);

如果我要输入延迟0,它将正常运行。但没有延迟,它会点击太快。 当我添加一个延迟时它会点击很好但是,当我释放触发键时,它会在点击时间的情况下继续点击几秒钟。但是延迟为0不会这样做。

完整代码:

public class App implements NativeKeyListener{

private JPanel panel1;
private JTabbedPane tabbedPane1;
private JButton spoilerButton;
private JSlider slider1;
private JSlider slider2;

//Removed irrelevant code...

static Robot bot;

static {
    try {
        bot = new Robot();
    } catch (Exception e) {
        e.printStackTrace();
    }
}

static boolean pressed;

public void click() throws InterruptedException {

    try {

        bot.mousePress(InputEvent.BUTTON1_MASK);
            Thread.sleep(50);
        bot.mouseRelease(InputEvent.BUTTON1_MASK);

    } catch (Exception e) {
        e.printStackTrace();
    }}

@Override
public void nativeKeyPressed(NativeKeyEvent e) {
    if (NativeKeyEvent.getKeyText(e.getKeyCode()) == "Delete") {
        pressed = true;
        while (pressed){
            try {
                click();
            } catch (InterruptedException e1) {
                e1.printStackTrace();
            }
        }


    }}

@Override
public void nativeKeyReleased(NativeKeyEvent e) {
    if (NativeKeyEvent.getKeyText(e.getKeyCode())=="Delete"){
        pressed=false;
    }}

@Override
public void nativeKeyTyped(NativeKeyEvent e) {

}

public static void main(String[] args) {

    JFrame frame = new JFrame("Autoclicker");
    frame.setContentPane(new App().panel1);
    frame.setVisible(true);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setLocationRelativeTo(null);
    frame.setSize(400,148);
    frame.setResizable(false);

    try{GlobalScreen.registerNativeHook();
    } catch (Exception e){
                System.exit(1);}
    GlobalScreen.addNativeKeyListener(new App());

}
} 

1 个答案:

答案 0 :(得分:0)

当您按住触发键时,看起来连续调用nativeKeyPressed()方法。这导致多次调用click()方法(假设它是多线程的)并且由于鼠标按下和释放之间的睡眠()(释放后鼠标点击完成),这可能发生。

因此,您可以根据根本原因尝试两种选择:
1.释放鼠标后移动sleep()调用。如果同时调用nativeKeyPressed,则无法工作 2.按下触发器时,使用不同的线程执行click()方法。在这种情况下,您可能需要每次使用'按下'提交一个Runnable对象到您的主题。检查并单击()调用。这将确保在压力变为假之后它不会运行。