java - 使用 JNativeHook 仅读取每个按键一次

标签 java javafx jnativehook

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

这是我的代码的相关部分:(这是在我的主类中,它扩展了 Application 并实现了 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) {

}

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

最佳答案

只需将您的代码移至nativeKeyTyped即可。每次按下并释放按键时只会触发一次。

按下的按键将在初始点击时触发,然后在正常点击和按住按键之间的超时后,每次更新都会提供按下的按键更新。

如果您想要更多控制,您可以添加 map 。此示例使用 HashMap 来记录是否按下某个键以及在再次触发之前应等待多少次更新。不过我并没有仔细查看 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);
}

关于java - 使用 JNativeHook 仅读取每个按键一次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51944245/

相关文章:

JavaFX InvalidationListener 或 ChangeListener

java - jnativehook 的关键事件

java - 将 ArrayList 转换为数组(有点不同)

java - 在 Android 5+ 中将应用程序设置为使用蜂窝网络而不是 WiFi

java - Android - 将 RecyclerView 与默认适配器一起使用

java - 平移/旋转/移动图形对象而不弄乱整个屏幕

JavaFX 缩放形状而不移动原点

JavaFX。为什么固定半径大小的渐变不能定位?

JavaFx : bring stage to focus on keypress

java - NullPointerException 尝试从 JnativeHook 鼠标事件设置 javafx TextField 文本时出错