我一直在尝试使用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());
}
}
答案 0 :(得分:0)
当您按住触发键时,看起来连续调用nativeKeyPressed()方法。这导致多次调用click()方法(假设它是多线程的)并且由于鼠标按下和释放之间的睡眠()(释放后鼠标点击完成),这可能发生。
因此,您可以根据根本原因尝试两种选择:
1.释放鼠标后移动sleep()调用。如果同时调用nativeKeyPressed,则无法工作
2.按下触发器时,使用不同的线程执行click()方法。在这种情况下,您可能需要每次使用'按下'提交一个Runnable对象到您的主题。检查并单击()调用。这将确保在压力变为假之后它不会运行。