使用Java的机器人按住键

目前我正在努力让java按下如下键:

Robot rob; rob.keyPress(KeyEvent.VK_ENTER); Thread.sleep(3000); rob.keyRelease(KeyEvent.VK_ENTER); 

这应该按住3秒钟,在一秒左右后产生重复效果。 换句话说,如果您要手动按住“r”键,它将首先键入r,然后大约一秒后它会像rrrrrrrr一样。 我想从机器人那里得到这个效果。 我也尝试过:

 curTime = System.currentTimeMillis(); while(System.currentTimeMillis() - curTime < duration) { rob.keyPress(whatever); } rob.keyRelease(whatever); 

然而,这是非常敏感的,持续时间为1秒输出……好吧,你的计算机可以在1秒钟内完成许多任务。 成千上万的线条值得。 这不是我的意图。 有任何想法吗? 谢谢!

PS我想要这种行为的原因是因为我正在编写一种脚本语言来自动化游戏。 如果我想像正常人那样按住向上箭头键,我认为我需要我正在谈论的行为。

编辑:

由于似乎有些混乱,我道歉。 让我详细说明一下。 在我的第一个代码中,如果我选择“r”作为角色,它将只打印一个r而不管持续时间。 如果您在键盘上按“r”5秒钟,它将会 – > r … rrrrrrrrrrrrrrr …其中……意思是一秒钟。 这是我想要的行为,但我不会得到它。 第二个代码是我尝试垃圾邮件的地方点击“按”,但这实际上键入“r”它执行的每一次。 因此,如果我在一个持续时间的定时循环中,每次循环迭代它将发送“r”按钮。 那不是我想要的。 我想要的是,同样的结果就像你将键盘按下键盘3秒钟一样。 首先它只是一个r,然后是rrrrrrrrrrrrrrrrrrrrrr。 我甚至不确定release()方法的作用……我想如果你把它留在按下但没有释放,它就会在循环中将SPAM屏蔽掉! 为什么不这样做,关键是压力? 这让我很困惑。 显然,当按下某个键时,它不会按住。

如果我理解您的问题,则在使用RobotkeyPress时无法获得重复的重复。

在这种情况下,您可能需要生成“psudo”“long”按键。

基本上,我尝试过这样的事情:

 Robot bot = new Robot(); bot.setAutoDelay(1); int duration = 3000; long start = System.currentTimeMillis(); while (System.currentTimeMillis() - start < duration) { bot.keyPress(KeyEvent.VK_R); bot.keyRelease(KeyEvent.VK_R); } 

其中,在一段时间内快速按下并释放钥匙......

我用它来测试它...

 import java.awt.BorderLayout; import java.awt.EventQueue; import java.awt.Robot; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.KeyEvent; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTextArea; import javax.swing.SwingWorker; import javax.swing.UIManager; import javax.swing.UnsupportedLookAndFeelException; public class TestRobot { public static void main(String[] args) { new TestRobot(); } public TestRobot() { EventQueue.invokeLater(new Runnable() { @Override public void run() { try { UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { } JFrame frame = new JFrame("Testing"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setLayout(new BorderLayout()); frame.add(new TestPane()); frame.pack(); frame.setLocationRelativeTo(null); frame.setVisible(true); } }); } public class TestPane extends JPanel { private JTextArea ta; public TestPane() { setLayout(new BorderLayout()); ta = new JTextArea(20, 20); ta.setWrapStyleWord(true); ta.setLineWrap(true); add(new JScrollPane(ta)); JButton btn = new JButton("Start"); btn.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { ta.requestFocusInWindow(); ta.append("Start\n"); SwingWorker worker = new SwingWorker() { @Override protected Object doInBackground() throws Exception { Robot bot = new Robot(); bot.setAutoDelay(1); int duration = 3000; long start = System.currentTimeMillis(); while (System.currentTimeMillis() - start < duration) { bot.keyPress(KeyEvent.VK_R); bot.keyRelease(KeyEvent.VK_R); } return null; } @Override protected void done() { ta.append("\nDone"); } }; worker.execute(); } }); add(btn, BorderLayout.SOUTH); } } } 

更新

经过一点点测试,我就能让这个工作......

 Robot bot = new Robot(); bot.setAutoDelay(50); int duration = 3000; long start = System.currentTimeMillis(); while (System.currentTimeMillis() - start < duration) { bot.keyPress(KeyEvent.VK_R); } bot.keyRelease(KeyEvent.VK_R); 

现在,如果您使用autoDelay属性,您可以调整每个事件之间的时间(以毫秒为单位),这可能会产生更理想的效果......

为什么不使用for循环?

 for (int i = 0; i < 10; i++) rob.keyPress(whatever); 

或者,模仿您想要的抑制效果:

 rob.keyPress(whatever); Thread.sleep(500); for (int i = 0; i < 10; i++) { rob.keyPress(whatever); Thread.sleep(10); } 

如果您想要更多“有机”行为,只需随机化迭代次数即可。