Имитация ключа, удерживаемого в Java - PullRequest
3 голосов
/ 24 апреля 2009

Я хочу смоделировать действие удержания клавиши клавиатуры в течение короткого периода времени в Java. Я ожидаю, что следующий код будет удерживать клавишу A в течение 5 секунд, но он нажимает ее только один раз (при тестировании в блокноте выдает одно «a»). Любая идея, если мне нужно использовать что-то еще, или я просто неправильно здесь использую класс awt.Robot?

Robot robot = null; 
robot = new Robot();
robot.keyPress(KeyEvent.VK_A);
Thread.sleep(5000);
robot.keyRelease(KeyEvent.VK_A);

Ответы [ 3 ]

4 голосов
/ 25 апреля 2009

Thread.sleep () останавливает выполнение текущего потока (потока, удерживающего клавишу).

Если вы хотите, чтобы он удерживал клавишу в течение определенного времени, возможно, вам следует запустить его в параллельном потоке.

Вот предложение, которое поможет обойти проблему Thread.sleep () (использует шаблон команд, чтобы вы могли создавать другие команды и менять их по желанию):

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();
}
2 голосов
/ 25 апреля 2009

Просто продолжайте нажимать?

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 );
        }
    }
}

Я думаю, что ответ от Эдварда подойдет !!

0 голосов
/ 24 апреля 2009

В java.lang.Robot нет события keyDown. Я попробовал это на своем компьютере (тестирование на консоли под Linux, а не с помощью блокнота), и это сработало, выдав строку «а». Возможно, это просто проблема с NotePad?

...