Читайте каждое нажатие клавиши только один раз с 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) {
}
Все это работает нормально, но если я удержу клавишу, то она будет спамить этот код клавиши в консоли. Могу ли я остановить это?
1 ответ
Просто переместите свой код в 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);
}