#java #консоль #ввод #клавиатура #listener
Пишу Java консольное приложение для Линукс и Виндовс, которое одновременно прослушивает нажатие клавиатуры и выводит информацию (без нажатия клавиши Enter для принятия ввода текста). Как это можно сделать? Знаю про JNI, Jline, JavaCurces но нет навыков их использования, хотелось бы сделать все средствами Java.
Ответы
Ответ 1
Одной из ключевых особенностей Java является написание кроссплатформенных программ. Для получения одинакового результата в разных операционных системах Java выполняет разный код в разных ОС. Упомянутые Вами программы это именно именно такие обёртки над системными функциями. Если кроссплатформенность хоть сколько-нибудь важна, лучше использовать их. Из JLine FAQ: How does JLine work? On Windows, JLine uses a native .dll (which it automatically extracts from the jline jar and loads at runtime) to access native console features. On UNIX systems, JLine will perform the necessary terminal setup by launching the "stty" command.Ответ 2
На данный момент, я нашел решение с использованием jNativeHook. На Windows еще не тестировал, на Alt Linux работает хорошо. Осталось только сделоть прослушку клавиш не глобальгно, а только для окна консоли. package test; import java.io.IOException; import java.util.logging.Handler; import java.util.logging.Level; import java.util.logging.LogManager; import java.util.logging.Logger; import org.jnativehook.GlobalScreen; import org.jnativehook.NativeHookException; import org.jnativehook.keyboard.NativeKeyEvent; import org.jnativehook.keyboard.NativeKeyListener; public class Test0 implements NativeKeyListener { public static void main(String[] args) throws IOException { for (Handler handler : Logger.getLogger("").getHandlers()) handler.setLevel(Level.OFF); try { GlobalScreen.registerNativeHook(); } catch (NativeHookException ex) { System.exit(1); } GlobalScreen.addNativeKeyListener(new Test0()); } public void nativeKeyPressed(NativeKeyEvent e) { System.out.println(NativeKeyEvent.getKeyText(e.getKeyCode()).toLowerCase()); } public void nativeKeyReleased(NativeKeyEvent e) { } public void nativeKeyTyped(NativeKeyEvent e) { } } Все еще надеюсь найти лучшее решение, или сделать прослушку не глобальной.Ответ 3
Такой вопрос уже был на stackoverflow: Equivalent function to C's “_getch()” in Java? Вот исходный код на ваш вопрос. Опубликованный в посте: public static void getCh() { final JFrame frame = new JFrame(); synchronized (frame) { frame.setUndecorated(true); frame.getRootPane().setWindowDecorationStyle(JRootPane.FRAME); frame.addKeyListener(new KeyListener() { @Override public void keyPressed(KeyEvent e) { synchronized (frame) { frame.setVisible(false); frame.dispose(); frame.notify(); } } @Override public void keyReleased(KeyEvent e) { } @Override public void keyTyped(KeyEvent e) { } }); frame.setVisible(true); try { frame.wait(); } catch (InterruptedException e1) { } } }Ответ 4
Эт уже руткит получается. В линухе так получится отслеживать только того, из под которого запущена прога. Да и то вряд-ли.
Комментариев нет:
Отправить комментарий