当前位置: 首页 > 知识库问答 >
问题:

延迟按键

鲜于岳
2023-03-14

我一直在寻找能在按键之间有一点延迟的方法。我一直在制作这个程序,它使用JIntellitype库读取全局热键,然后启动您指定的任何一个按键序列,例如按numpad1将执行一个B C序列。我的问题是,如果我使用线程。睡眠它只是延迟X个时间,然后按所有指定的键,在任何按键之间没有任何延迟。有人对如何解决这个问题有什么建议吗?提前谢谢!

这就是我用来发送机器人类按键的东西

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个答案

吕皓
2023-03-14

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

>

  • 你只是在按键,你也需要释放按键:

    robot.keyPress(c);
    robot.keyRelease(c);
    

    你可以在EDT中运行机器人。使用另一个线程来处理按键。。。

    使用Robot类已经提供的内置自动延迟功能:

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

    这是一个如何实现这一点的示例,每次按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);
        }
    }
    

  •  类似资料:
    • 问题内容: 我正在尝试使用新的React Lazy和Suspense创建后备加载组件。这很好用,但后备时间仅显示几毫秒。有没有办法增加额外的延迟或最短时间,因此我可以在渲染下一个组件之前显示该组件的动画? 现在懒导入 等待组件: 我可以做这样的事情吗? 问题答案: 函数应该返回对象的承诺,该对象由具有默认导出功能的模块返回。不会返回承诺,也不能那样使用。尽管任意承诺可以: 如果目标是提供 最小的

    • 问题内容: 如何在jQuery中的按键之间延迟动作。例如; 我有这样的东西 如果用户连续输入,我想防止发布数据。那么我该如何延迟0.5秒呢? 问题答案: 您可以使用jQuery的数据功能来执行此操作,如下所示: 这里的主要优点是到处都没有全局变量,并且您可以根据需要将其包装在setTimeout中的匿名函数中,只是尝试使示例尽可能简洁。

    • 问题内容: 我正在尝试制作一个Java应用程序,该应用程序能够在检测到Midi设备后在计算机上播放笔记。 一旦获得所需的Midi设备,我就设置了接收器,该设备的发送器将向其发送MIDI消息。 类MyReceiver看起来像: 当我运行代码并开始在Midi设备上播放时,我的等待时间很长(我听不到即时的笔记)。 我该如何解决这个问题? 问题答案: 我正在使用使用asio驱动程序来避免延迟的JAsioH

    • 问题内容: 该Plunkr有2个链接。左侧的那个正在使用ng-click指令,并插入了on angular-touch模块。如ng- click的角接触模块描述中所述,ng-click链接不应具有300ms的延迟。但是,如果您在移动设备上进行测试,情况仍然如此。 那么plunkr是否会阻止正确的功能,因为它是在iFrame中执行的或类似的操作,还是需要将Fastclick.js插入项目才能使指令正

    • 我正在为我正在开发的web应用程序试用AWS3和CloudFront。 在应用程序中,我允许用户上传文件到S3 bucket(使用AWS SDK)并通过CloudFront CDN使其可用,但问题是即使文件在S3 bucket中上传并准备就绪,也需要大约一到两分钟才能在CloudFront CDN url中可用,这正常吗?

    • 我正面临着G1GC算法中GC停顿的持续增加。服务延迟随着时间的推移继续增长。一旦发生这种情况,我将重新启动服务,延迟时间将恢复正常。启动后,等待时间再次随着时间的推移而增加。