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

持有一个物理键,然后使用awt.robot在Java中自动按下相同的键

闻人越
2023-03-14

我在我的程序中使用JNativeHook来检测程序之外的全局键程。这就是我需要完成的:

// These are the global variables
// ...
Robot robot;  // Initialized in the constructor
// ...
boolean spaceDown = false;
boolean activeThread = false;

private void pressSpace(){

    robot.keyPress(KeyEvent.VK_SPACE);
    robot.delay(20);
    robot.keyRelease(KeyEvent.VK_SPACE);
    robot.delay(30);

    System.out.println("Robot - Press/Release");

}

private void executeThread(){

    new Thread(){
        public void run(){
            while(spaceDown){
                pressSpace();
            }
            activeThread = false;
        }
    }.start();

}

public void nativeKeyPressed(NativeKeyEvent e){

    if(e.getKeyCode() == NativeKeyEvent.VC_SPACE){

        System.out.println("Physical - Pressed");

        activeThread = true;
        spaceDown = true;
        if(activeThread){
            executeThread();
        }
    }

}
public void nativeKeyReleased(NativeKeyEvent e){

    if(e.getKeyCode() == NativeKeyEvent.VC_SPACE){
        System.out.println("Physical - Released");
        spaceDown = false;
    }

}
...
Physical - Pressed
Physical - Released
Robot - Press/Release
Physical - Pressed
Physical - Released
Robot - Press/Release
...

共有1个答案

洪季萌
2023-03-14

我不知道你为什么要这么做...当你按住一个键时,在重复延迟过去后,你基本上得到一个键,即使在重复率下,直到你释放。如果要模拟按键弹回,即按键先按下,然后释放,而不是重复按键按下事件:

// These are the global variables
public void nativeKeyPressed(NativeKeyEvent e){

    if(e.getKeyCode() == NativeKeyEvent.VC_SPACE){

        System.out.println("Physical - Pressed");

        // This should produce a key release event.
        GlobalScreen.postNativeEvent(new NativeKeyEvent(
            NativeKeyEvent.NATIVE_KEY_RELEASED, 
            e.getWhen(), 
            e.getModifiers(), 
            e.getRawCode(), 
            e.getKeyCode, 
            e.getKeyChar(), 
            e.getKeyLocation()));
    }

}

上面的示例有很多线程安全问题,这可能是问题的原因。

 类似资料:
  • 我正在尝试使用selenium创建自动化,以安装chrome扩展。当我尝试在amazon虚拟机上运行这个jar时,我遇到了一个问题,因为当我尝试用robot类按enter键时,它不起作用,因为我没有连接物理键盘。我不能在selenium中使用sendkeys,因为来自google的pop不在同一页面,selenium无法识别它。有什么解决办法吗?

  • 我正在尝试构建一个自动化脚本来安装chrome扩展。 在我的本地系统(windows 10)上,当使用java的Robot类时,所有这些都可以正常工作,因为我有一个物理键盘连接到我的计算机。 问题是——当我试图在虚拟机(亚马逊EC2,视窗服务器)上运行这种自动化时,机器人类不起作用,因为它无法检测键盘的物理连接。 有没有其他方法可以在不连接键盘的情况下模拟键盘行程? 仅供参考,我必须使用键盘,因为

  • 问题内容: 我有以下方法可以在Angular中捕获按键: 我听着 但是,我想检测何时同时按下两个键,例如和同时按下(不是一个一个又一个又一个的组合)。 最好的方法是什么? 编辑 我当时想的是: 因此,如果我有多个按键,那么我将创建正确的。但是,问题在于,现在顺序很重要(即,如果我按then ,则按is ;如果我按另一种方式按,则得到) 问题答案: 我认为广播使用过多。而是使用自定义指令?这是一个用

  • 我有一个RecyclerView,它的Adapter.class在一个单独的文件中,但是适配器中的onClickListener可以通过start ActivityForResult启动第二个活动。当我有用户输入时,我希望应用程序将数据发送回第一个活动,这仅在用户使用我提供的按钮时才有效,但当他使用后键时则无效,即使它在相应的功能中运行相同的代码。 我将完全相同的代码从按钮复制到onBackPre

  • 问题内容: 我们是否可以用一个键和两个值实现HashMap。就像HashMap一样? 还请告诉我(如果没有办法)通过其他任何方法来实现三个值的存储(以一个为键)的方法,对我有帮助吗? 问题答案: 你可以: 使用具有列表作为值的地图。 创建一个新的包装器类,并将该包装器的实例放置在地图中。。 使用类似类的元组(节省创建许多包装器)。。 并排使用多个地图。 例子 1.使用列表作为值进行映射 这种方法的