使用JNativeHook仅读取一次按键

时间:2018-08-21 08:04:42

标签: java javafx jnativehook

在我的程序中,希望有一个文本字段,其中包含用户按下的当前键。我可以使用JNativeHook做到这一点,但是当前的问题是JNativeHook在按下时会记录大量按键。有没有办法忽略键保持?我想简单地将当前持有的任何键添加到文本字段,而不用重复填充

这是我代码的相关部分:(这是在我的扩展应用程序并实现NativeKeyListener的主类中)

@Override
public void nativeKeyPressed(NativeKeyEvent e) {
    System.out.print(NativeKeyEvent.getKeyText(e.getKeyCode()) + " + ");

    if (e.getKeyText(e.getKeyCode()) == "F6")
        System.out.println("F6");


}
@Override
public void nativeKeyReleased(NativeKeyEvent e) {
    try {
        GlobalScreen.unregisterNativeHook();
    } catch (NativeHookException ex) {}
}
@Override
public void nativeKeyTyped(NativeKeyEvent e) {

}

所有这些都可以正常工作,但是如果我按住某个键,它将在控制台中向该键代码发送垃圾邮件。我可以停止吗?

1 个答案:

答案 0 :(得分:0)

只需将代码移至nativeKeyTyped。每次您按下并释放一个键时,它只会触发一次。

按下的键将在首次点击时触发,然后在正常点击和按住的键之间的超时时间后,将在每次更新时对按下的键进行更新。

如果您想要更多控制权,尽管可以添加地图。本示例使用哈希图记录是否按下了按键,以及它应该等待多少次更新才能再次触发。我没有完全看一下api,因此如果某些函数调用的键入错误,我也不会感到惊讶。

private Map<Integer, Integer> keysHeld = new Hashmap();


@Override
public void nativeKeyPressed(NativeKeyEvent e) {
    //When the countdown gets to 0, do a key update
    if (keysHeld.getOrDefault(e.keyCode(), 0) <= 0) {
        //Do whatever you want to do.

        //Set the countdown again, so it can be activated again after a reasonable amount of time.
        keysHeld.put(e.keyCode(), 50);
    }

    //Decrease the countdown by 1 each update until it triggers or is released.
    keysHeld.put(e.keyCode(), e.getOrDefault(e.keyCode(), 50) - 1);
}

 @Override
 public void nativeKeyReleased(NativeKeyEvent e) {
     //Reset countdown when key is released.
     keysHeld.put(e.keyCode(), 0);
}