Использование робота Java для удержания клавиши
7022 просмотра
2 ответа
В настоящее время я пытаюсь, чтобы 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 ... rrrrrrrrrrrrrr где ... означает секунду. Это поведение, которое я хочу, но я не получу его. Во втором коде я пытаюсь спамить, нажимая «нажать», но это буквально набирает «r» КАЖДЫЙ раз, когда он выполняется. Так что, если я нахожусь в цикле по времени, каждый раз, когда цикл повторяется, он отправит кнопку «r». Это не то, что я хочу. То, что я хочу, опять же, это тот же результат, что и при нажатии клавиши r на клавиатуре в течение 3 секунд. Сначала его всего один г, а затем ррррррррррррррррррррр. Я' Я даже не уверен, что делает метод release () ... Я подумал, что если вы оставите его на прессе без релиза, он просто СПАМИТ экран по кругу! Почему бы и нет, ключ НАЖМИТ? Это то, что смущает меня. Очевидно, что когда клавиша нажата, она не остается нажатой.
Автор: user2045279 Источник Размещён: 13.11.2019 11:32Ответы (2)
4 плюса
Если я понимаю вашу проблему, вы не можете получить повторения клавиш при использовании Robot
и keyPress
.
В этом случае вам может потребоваться произвести «псевдо» «длинное» нажатие клавиши.
В основном я пробовал что-то вроде этого:
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
свойством, вы можете настроить время (в миллисекундах) между каждым событием, что может дать более желательный эффект ...
1 плюс
Почему бы не использовать 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);
}
Если вы хотите более «органичного» поведения, просто рандомизируйте количество итераций.
Автор: Zong Размещён: 27.06.2013 01:42Вопросы из категории :
- java В чем разница между int и Integer в Java и C #?
- java Как я могу определить IP моего маршрутизатора / шлюза в Java?
- java Каков наилучший способ проверки XML-файла по сравнению с XSD-файлом?
- java Как округлить результат целочисленного деления?
- java Преобразование списка <Integer> в список <String>
- java Почему я не могу объявить статические методы в интерфейсе?
- awt "Всегда сверху" Windows с Java
- awt В чем разница между Swing и AWT?
- awt Нужна помощь в понимании влияния двух системных свойств Java, связанных с графическим интерфейсом
- awt Как закрыть окно в AWT?
- awt Портирование графического кода AWT на Android
- awt Что делает SwingUtilities.invokeLater?
- awtrobot Загрузка файлов с использованием Selenium WebDriver и Java Robot Class
- awtrobot Класс Drag / Drop Robot
- awtrobot Перемещение мыши класса Java Robot в положение определенного пикселя (щелчок мышью по цвету)
- awtrobot Использование робота Java для удержания клавиши
- awtrobot Более быстрая альтернатива java.awt.Robot.createScreenCapture?
- awtrobot Selenium Actions или Java AWT Robot?