使用 JNativeHook 仅读取一次按键
Read each key press only once with JNativeHook
在我的程序中想要有一个文本字段,其中将包含用户当前按下的键。我可以用 JNativeHook 做到这一点,但目前的问题是 JNativeHook 在按下时会记录大量按键。有没有办法忽略按键保持?我想简单地将当前保存的任何键附加到文本字段,而不用重复填充它
这是我的代码的相关部分:(这是在我的主要 class 中,它扩展了 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。每次按下和释放按键时只触发一次。
按键将在初始点击时触发,然后在正常点击和按住按键之间超时后,每次更新都会提供按键更新。
如果您想要更多的控制权,您可以只添加一张地图。此示例使用哈希图记录是否按下某个键以及在再次触发之前应等待多少次更新。不过,我并没有完全查看 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);
}
在我的程序中想要有一个文本字段,其中将包含用户当前按下的键。我可以用 JNativeHook 做到这一点,但目前的问题是 JNativeHook 在按下时会记录大量按键。有没有办法忽略按键保持?我想简单地将当前保存的任何键附加到文本字段,而不用重复填充它
这是我的代码的相关部分:(这是在我的主要 class 中,它扩展了 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。每次按下和释放按键时只触发一次。
按键将在初始点击时触发,然后在正常点击和按住按键之间超时后,每次更新都会提供按键更新。
如果您想要更多的控制权,您可以只添加一张地图。此示例使用哈希图记录是否按下某个键以及在再次触发之前应等待多少次更新。不过,我并没有完全查看 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);
}