Использование робота Java для удержания клавиши

java awt awtrobot

7022 просмотра

2 ответа

376 Репутация автора

В настоящее время я пытаюсь, чтобы 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 Источник Размещён: 27.06.2013 01:36

Ответы (2)


1 плюс

5093 Репутация автора

Почему бы не использовать 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

4 плюса

307857 Репутация автора

Решение

Если я понимаю вашу проблему, вы не можете получить повторения клавиш при использовании 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свойством, вы можете настроить время (в миллисекундах) между каждым событием, что может дать более желательный эффект ...

Автор: MadProgrammer Размещён: 27.06.2013 01:47
Вопросы из категории :
32x32