延迟keyPress

时间:2012-07-18 22:56:53

标签: java awt delay keypress awtrobot

我一直在寻找能够在按键之间稍微延迟的方法。我一直在使用JIntellitype库创建这个读取全局热键的程序,然后触发你指定的任何一系列按键,比如按下numpad1将执行AB C序列。我的问题是,如果我使用Thread.sleep它只需延迟X个时间,然后按下所有指定的键,任何按键之间没有任何延迟。有没有人建议如何解决这个问题? 先谢谢!

这是我用于向Robot类发送按键的方法

public void onHotKey(int identifier) {
    try {
        Robot bot = new Robot();
        if (output.elementAt(identifier - 1).length() == 1) {
            ch = output.elementAt(identifier - 1).charAt(0);
            bot.keyPress(ch);
        } else {
            int cmdSize = output.elementAt(identifier - 1).length();
            for (int c = 0; c < cmdSize; c++) {
                bot.keyPress((int) output.elementAt(identifier - 1).charAt(c));
                try {
                    Thread.sleep(50);
                } catch (InterruptedException ex) {
                    Logger.getLogger(NewJFrame.class.getName()).log(Level.SEVERE, null, ex);
                }
            }
        }
    } catch (AWTException ex) {
        Logger.getLogger(NewJFrame.class.getName()).log(Level.SEVERE, null, ex);
    }
}

1 个答案:

答案 0 :(得分:2)

这些是您可能遇到的一些问题(我还在下面添加了一个“完整”示例):

  1. 只按键,您也需要释放密钥:

    robot.keyPress(c);
    robot.keyRelease(c);
    
  2. 您可以在EDT中运行机器人。 使用另一个线程来处理按键...

  3. 使用Robot类已提供的“内置”auto delay功能:

    Robot robot = new Robot();
    robot.setAutoDelay(50); // ms
    ...
    

  4. 实施例

    这是一个如何实现这一点的示例,每当您按0时,它将使用自动延迟打印"hello"延迟每个键入的字符:

    public static void main(String[] args) throws Exception {
    
        final BlockingQueue<Integer> queue = new ArrayBlockingQueue<Integer>(20);
    
        JTextArea area = new JTextArea(10, 40) {{
            addKeyListener(new KeyAdapter() {
                @Override public void keyPressed(KeyEvent e) {
                    if (e.getKeyCode() == KeyEvent.VK_0) {
                        queue.offer(KeyEvent.VK_H);
                        queue.offer(KeyEvent.VK_E);
                        queue.offer(KeyEvent.VK_L);
                        queue.offer(KeyEvent.VK_L);
                        queue.offer(KeyEvent.VK_O);
                    }
                }
            });
        }};
    
        JFrame frame = new JFrame("Test");
        frame.add(area);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.pack();
        frame.setVisible(true);
    
        Robot robot = new Robot();
        robot.setAutoDelay(50);
    
        while (true) {
            final int c = queue.take();
            robot.keyPress(c);
            robot.keyRelease(c);
        }
    }