如何防止或删除后台Java进程中的前台文本输入?

如何防止或删除后台Java进程中的前台文本输入?,java,jnativehook,Java,Jnativehook,我正在创建一个后台Java程序,该程序将从一个支持USB的NFC阅读器获取输入,并使用在其上找到的数据(一个10位数字)执行一个API请求。但是,阅读器没有自己的软件,就像键盘一样,将扫描的数字输入任何选定的文本字段 通过使用,我能够创建一个键盘记录器类型的软件,该软件等待10位数字被快速输入,然后发出API请求。这种方法非常有效,但数字仍然输入到任何前景/选定的文本字段中,因此我一直在寻找解决方法 我想知道是否有一种方法可以在显示之前验证所有文本输入,或者在输入数字后立即退格 如果您想查看整个

我正在创建一个后台Java程序,该程序将从一个支持USB的NFC阅读器获取输入,并使用在其上找到的数据(一个10位数字)执行一个API请求。但是,阅读器没有自己的软件,就像键盘一样,将扫描的数字输入任何选定的文本字段

通过使用,我能够创建一个键盘记录器类型的软件,该软件等待10位数字被快速输入,然后发出API请求。这种方法非常有效,但数字仍然输入到任何前景/选定的文本字段中,因此我一直在寻找解决方法

我想知道是否有一种方法可以在显示之前验证所有文本输入,或者在输入数字后立即退格

如果您想查看整个(小型)项目,它是可用的

CardReaderKeylogger.java:


你将不得不截获(并停止传播)每一个笔划,分析并重新发送到原始目标,如果它不打算被捕获。这显然会给键盘输入带来滞后。这当然可能与WinAPI有关

根据文档,这目前不可能跨平台,但可能在某些操作系统上工作


这非常有效,谢谢!我设置它是为了让JNativeHook快速地消耗输入的每一个关键事件,这实际上还没有显示任何延迟。它似乎在macOS和Windows10上都运行良好。
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);
}
}