Как предотвратить или удалить ввод текста переднего плана из фонового процесса Java? - PullRequest
0 голосов
/ 09 октября 2019

Я создаю фоновую Java-программу, которая будет принимать данные от считывателя NFC с поддержкой USB и выполнять запрос API с найденными на нем данными (10-значное число). Однако у читателей нет собственного программного обеспечения, и они ведут себя как клавиатура, вводя отсканированное число в любое выделенное текстовое поле.

Используя JNativeHook , я смог создать тип кейлоггерапрограммного обеспечения, которое ожидает быстрого ввода 10-значного числа, а затем отправляет запрос API. Этот подход прекрасно работает, но число все еще вводится в любом переднем плане / выделенном текстовом поле, поэтому я искал способы исправить это.

Мне было интересно, есть ли способ проверить весь текствводы перед их отображением или сразу же возвращайте этот номер после ввода.

Если вы хотите взглянуть на весь (маленький) проект, он доступен здесь .

CardReaderKeylogger.java :

class CardReaderKeylogger {
static void initialize() {
    //Turn off mouse logging
    LogManager.getLogManager().reset();
    Logger logger = Logger.getLogger(GlobalScreen.class.getPackage().getName());
    logger.setLevel(Level.OFF);

    //Key listen events
    NativeKeyListener keyListener = new NativeKeyListener() {
        @Override public void nativeKeyTyped(NativeKeyEvent nativeKeyEvent) { }
        @Override public void nativeKeyReleased(NativeKeyEvent nativeKeyEvent) { }

        String buddingID = "";
        @Override public void nativeKeyPressed(NativeKeyEvent key) {
            String keyPressed = NativeKeyEvent.getKeyText(key.getKeyCode());
            try { //Only stores value if it's a number
                Integer.parseInt(keyPressed);
                //Starts a timer to reset the number if it isn't all entered in time
                if (buddingID.equals("")) {
                    Timer timer = new Timer();
                    timer.schedule(new TimerTask() {
                        @Override public void run() {
                            //System.out.println("Resetting id");
                            buddingID = "";
                            timer.cancel();
                        }
                    }, 200, 200);
                }
                buddingID += keyPressed;
                if (buddingID.length() == 10) {
                    PassToggleRequest.send(buddingID);
                    buddingID = "";
                }
            } catch (NumberFormatException ex) {
                buddingID = "";
            }
        }
    };

    //Enable keylogger
    try {
        GlobalScreen.registerNativeHook();
    } catch (NativeHookException ex) {
        System.err.println("There was a problem registering the native hook.");
        System.err.println(ex.getMessage());
        return;
    }
    /* Construct the object and initialize native hook. */
    GlobalScreen.addNativeKeyListener(keyListener);
}
}

1 Ответ

1 голос
/ 09 октября 2019

Вы должны будете перехватывать (и останавливать распространение) каждый удар, анализировать и ОТМЕНИТЬ его до исходной цели, если она не предназначена для захвата. Это, очевидно, приведет к задержке ввода с клавиатуры. Это возможно сделать с WinAPI наверняка.

Согласно документации это в настоящее время не возможно кроссплатформенно, но может работать на некоторых ОС.

https://github.com/kwhat/jnativehook/wiki/ConsumingEvents

...