Имитировать удерживаемую клавишу в Java
Вопрос
Я хочу имитировать действие удержания клавиши клавиатуры нажатой в течение короткого периода времени в Java.Я бы ожидал, что следующий код будет удерживать клавишу A нажатой в течение 5 секунд, но он нажимает ее только один раз (выдает единственную букву "а" при тестировании в Блокноте).Есть идеи, нужно ли мне использовать что-то еще, или я просто неправильно использую класс awt.Robot здесь?
Robot robot = null;
robot = new Robot();
robot.keyPress(KeyEvent.VK_A);
Thread.sleep(5000);
robot.keyRelease(KeyEvent.VK_A);
Решение
Thread.sleep() останавливает выполнение текущего потока (потока, который удерживает нажатой клавишу).
Если вы хотите, чтобы он удерживал клавишу нажатой в течение определенного промежутка времени, возможно, вам следует запустить его в параллельном потоке.
Вот предложение, которое позволит обойти проблему Thread.sleep() (использует шаблон command, чтобы вы могли создавать другие команды и менять их местами по желанию):
public class Main {
public static void main(String[] args) throws InterruptedException {
final RobotCommand pressAKeyCommand = new PressAKeyCommand();
Thread t = new Thread(new Runnable() {
public void run() {
pressAKeyCommand.execute();
}
});
t.start();
Thread.sleep(5000);
pressAKeyCommand.stop();
}
}
class PressAKeyCommand implements RobotCommand {
private volatile boolean isContinue = true;
public void execute() {
try {
Robot robot = new Robot();
while (isContinue) {
robot.keyPress(KeyEvent.VK_A);
}
robot.keyRelease(KeyEvent.VK_A);
} catch (AWTException ex) {
// Do something with Exception
}
}
public void stop() {
isContinue = false;
}
}
interface RobotCommand {
void execute();
void stop();
}
Другие советы
Просто продолжай давить?
import java.awt.Robot;
import java.awt.event.KeyEvent;
public class PressAndHold {
public static void main( String [] args ) throws Exception {
Robot robot = new Robot();
for( int i = 0 ; i < 10; i++ ) {
robot.keyPress( KeyEvent.VK_A );
}
}
}
Я думаю, что ответ, предоставленный Эдвардом, подойдет!!
В java.lang.Robot нет события keyDown.Я попробовал это на своем компьютере (тестировал на консоли под Linux, а не с помощью notepad), и это сработало, выдав строку a .Возможно, это просто проблема с блокнотом?