【问题标题】:Java: Confining Robot simlated keypresses to the application itselfJava:将机器人模拟按键限制在应用程序本身
【发布时间】:2015-05-21 09:06:02
【问题描述】:

大家好,

我想了解如何将所有机器人模拟按键和鼠标移动限制在应用程序本身。我目前正在做一个小项目,为谷歌音乐创建一个音乐播放器。

我可以在执行机器人代码之前使窗口具有焦点,但这会给音乐播放器在系统托盘中带来太多麻烦,而且它会使设置为全屏的游戏窗口失焦。

private void Play(){
        try {                           
            Robot robot = new Robot();
            robot.keyPress(32);
            robot.keyRelease(32);   
        } catch (AWTException e) {          
            e.printStackTrace();
        }
    }

这是当前播放/暂停的机器人代码。它当前正在模拟按下的空格键。

部分解决方案

frame.dispatchEvent(new KeyEvent(Component, KeyEvent.KEY_TYPED, 0, 0, KeyEvent.VK_UNDEFINED, char Action)); // Component you want the key press to go

【问题讨论】:

    标签: java jframe awt keyevent


    【解决方案1】:

    将按键事件直接发送到文本组件。框架不需要有焦点就可以工作。

    text.dispatchEvent(new KeyEvent(text,
                                    KeyEvent.KEY_TYPED, 
                                    0,
                                    0,
                                    KeyEvent.VK_UNDEFINED, 
                                    'H'));
    

    如果您想从 EDT 执行此操作,请使用 invokeLater 进行设置:

    java.awt.EventQueue.invokeLater(new Runnable() {
        public void run() {
            text.dispatchEvent(new KeyEvent(text,
                                    KeyEvent.KEY_TYPED, 
                                    0,
                                    0,
                                    KeyEvent.VK_UNDEFINED, 
                                    'H'));
        }
    });
    

    【讨论】:

    • 你能解释一下吗?我正在尝试代码,似乎无法弄清楚它是如何工作的
    • 你需要暴露你想要接收关键事件的文本组件——在上面的例子中是text
    • 很抱歉,如果有混淆,但我不想从用户那里得到输入。我正在尝试在 java 窗口本身内输出空格键而不关注窗口。
    • 这就是这段代码的作用——它的作用类似于 Robot 类,但它不是针对当前聚焦的窗口,而是针对特定的组件。您调度的 KeyEvent 是由您的代码创建的,而不是由用户输入创建的。
    • 哦,嗯,猜猜那是有道理的。你能帮我设置一下吗,这是我第一次使用这种方法。 this.dispatchEvent(this, KeyEvent.KEY_TYPED, 0, 0, KeyEvent.VK_UNDEFINED, 'H'); // 将我的类扩展为 JFrame 所以第一个 KeyEvent 变为 KeyEvent.VK_SPACE 以模拟第一个被按下的空间 0,保持不变,第二个保持不变 然后第二个 keyevent 保持不变?显然最后有一个 char 会破坏调度方法。用于格式化空间的 pastebin:pastebin.com/jqLbePJ5
    猜你喜欢
    • 2017-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-18
    • 1970-01-01
    • 1970-01-01
    • 2011-01-20
    相关资源
    最近更新 更多