目前我正试图让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秒钟内完成许多任务.成千上万的线条值得.这不是我的意图.有任何想法吗?谢谢!
附:我想要这种行为的原因是因为我正在编写一种脚本语言来自动化游戏.如果我想像正常人一样按住向上箭头键,我认为我需要我正在谈论的行为.
编辑:
由于似乎有些混乱,我道歉.让我详细说明一下.在我的第一个代码中,如果我选择“r”作为角色,它将只打印一个r而不管持续时间.如果您在键盘上按“r”5秒钟,它将会 – > r … rrrrrrrrrrrrrrr在哪里…意味着像是第二次.这就是我想要的行为,但我不会得到它.第二个代码是我尝试垃圾邮件的地方点击“按”,但这实际上键入“r”它执行的每一次.因此,如果我在一个持续时间的定时循环中,每次循环迭代它将发送“r”按钮.那不是我想要的.我想要的是,同样的结果就像你将键盘按下键盘3秒钟一样.首先它只是一个r,然后是rrrrrrrrrrrrrrrrrrrrrr.我甚至不确定release()方法的作用……我想如果你把它留在没有发布的印刷机上,它就会在一个循环中将SPAM屏幕化!为什么不这样做,关键是压力?这让我很困惑.显然,当按下某个键时,它不会按住.
解决方法:
如果我理解您的问题,则在使用Robot和keyPress时无法获得重复的重复.
在这种情况下,您可能需要生成“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<Object, Object>() {
@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属性,您可以调整每个事件之间的时间(以毫秒为单位),这可能会产生更理想的效果……