当前位置: 首页 > 面试题库 >

使用Java的机器人按住键

谭灿
2023-03-14
问题内容

目前,我正在尝试让Java按下如下键:

Robot rob;

rob.keyPress(KeyEvent.VK_ENTER);
Thread.sleep(3000);
rob.keyRelease(KeyEvent.VK_ENTER);

按下Enter键3秒钟左右,将导致重复效果。换句话说,如果要手动按住“
r”键,它将首先键入r,然后大约一秒钟后,它会像rrrrrrrr一样。我想要机器人的这种效果。我也尝试过:

curTime = System.currentTimeMillis();

while(System.currentTimeMillis() - curTime < duration)
{
rob.keyPress(whatever);
}
rob.keyRelease(whatever);

但是,这非常敏感,持续时间为1秒…输出,以及计算机在一秒钟内可以完成的所有操作。千行价值。这不是我的意图。有任何想法吗?谢谢!

PS我想要这种行为的原因是因为我正在编写一种脚本语言来实现游戏自动化。如果我想像普通人一样按住向上箭头键,我认为我需要我在说的行为。

编辑:

由于似乎有些混乱,我对此表示歉意。让我详细说明。在我的第一个代码中,如果我选择“ r”作为字符,则无论持续时间如何,它都只会打印一个r。如果您在键盘上按“
r” 5秒钟,它将显示-> r …
rrrrrrrrrrrrrrrrr,其中…表示大约一秒钟的时间。那是我想要的行为,但我不会得到。第二个代码是我尝试向垃圾邮件发送消息的地方,单击“按”,但是每次执行时,它实际上都会键入“
r”。因此,如果我在定时循环中持续一段时间,则每次循环迭代都会发送“ r”按钮。那不是我想要的
同样,我想要的结果与将键盘上的r向下推3秒钟所产生的结果相同。首先是它的一个r,然后是rrrrrrrrrrrrrrrrrrrrrrr。一世’
我什至不知道release()方法的作用…我想如果您不加释放就将它留在印刷机上,它只会在屏幕上循环显示垃圾内容!为什么不按下键?这就是让我困惑的地方。显然,当按键被按下时,它不会保持按下状态。


问题答案:

如果我了解您的问题,那么使用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属性,则可以调整每个事件之间的时间(以毫秒为单位),这可能会产生更理想的效果…



 类似资料:
  • 我想用Java robot按住一把钥匙一段时间。我读过其他类似的文章,但都不管用。反复按键只会导致按键无法释放。 以下是我到目前为止的代码(由于只按了一次键,所以无法工作):

  • 问题内容: 我正在使用Robot类来模拟Java中的按键。但是我无法按Window键+ L,尽管我可以分别按它们。这是我的代码: 问题答案: 尝试以下方法:

  • 我正在尝试使用Robot类创建一个游戏机器人。我尝试了以下代码来执行鼠标的右键单击: 而且奏效了。 我正在客户端3D在线游戏上测试它。 按下键“1”应该在Game中执行某种移动,当我尝试下面的代码时,它不起作用: 但当我在游戏中聊天时使用该代码时,它确实起了作用。 它被测试了一遍又一遍,我得到了同样的结果。 是我做错了什么吗?还是游戏发现我不是那个按下那个键的人。

  • 问题内容: 使用该方法时,需要将哪种代码传递给JavaFX Robot ? 例如,下面的示例输入,而不是,因此我想某处有一个映射。 注意:这是JavaFX机器人,而不是AWT机器人。 问题答案: 代码在javafx.scene.input.KeyCode中定义为常量。 使用玻璃机器人,您可以使用不推荐使用的方法: 您也可以使用FXRobot,它以KeyCodes作为参数:

  • 我们正在与IE和Java一起运行Selenium。单击web页面上的链接将打开一个新的IE页面,该页面显然不是IE驱动程序的子页面,因此我无法执行驱动程序。switchTo();这一页是一个表单,文件名和确定按钮为空白。以前的开发人员创建了一个robot类,并发送9个TAB键压事件以获得OK按钮,然后发送一个 现在我需要更改文件名中的值,所以我计算了制表符的数量,直到我到达文件,然后做一个退格键并

  • 问题内容: 我创建了一个按钮,我想要这些: 当用户单击按钮时,它将保持按下状态约3秒钟。3秒钟后,按钮应再次看起来可按下。因此,用户必须等待3秒钟才能再次单击该按钮。我尝试了这些: 你有什么建议吗? 问题答案: 可能对您有帮助