如何防止或删除后台 Java 进程中的前台文本输入?
How to prevent or remove foreground text input from background Java process?
我正在创建一个后台 Java 程序,该程序将从启用 USB 的 NFC reader 获取输入并使用在其上找到的数据(10 位数字)执行 API 请求数字)。但是,reader 没有自己的软件,其行为就像一个键盘,将扫描的数字输入到任何选定的文本字段中。
使用 JNativeHook,我能够创建一个键盘记录器类型的软件,它会等待 10 位数字被快速输入,然后发出 API 请求。这种方法效果很好,但数字仍然输入到任何 foreground/selected 文本字段中,所以我一直在寻找解决该问题的方法。
我想知道是否有办法在显示所有文本输入之前验证它们,或者在输入数字后立即退格。
如果您想查看整个(小)项目,可以使用 here。
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);
}
}
您必须拦截(并停止传播)每一笔划,分析并重新发送到原始目标(如果它不打算被捕获)。这显然会给键盘输入带来延迟。这肯定与 WinAPI 有关。
根据文档,这目前无法跨平台,但可能适用于某些 OS。
我正在创建一个后台 Java 程序,该程序将从启用 USB 的 NFC reader 获取输入并使用在其上找到的数据(10 位数字)执行 API 请求数字)。但是,reader 没有自己的软件,其行为就像一个键盘,将扫描的数字输入到任何选定的文本字段中。
使用 JNativeHook,我能够创建一个键盘记录器类型的软件,它会等待 10 位数字被快速输入,然后发出 API 请求。这种方法效果很好,但数字仍然输入到任何 foreground/selected 文本字段中,所以我一直在寻找解决该问题的方法。
我想知道是否有办法在显示所有文本输入之前验证它们,或者在输入数字后立即退格。
如果您想查看整个(小)项目,可以使用 here。
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);
}
}
您必须拦截(并停止传播)每一笔划,分析并重新发送到原始目标(如果它不打算被捕获)。这显然会给键盘输入带来延迟。这肯定与 WinAPI 有关。
根据文档,这目前无法跨平台,但可能适用于某些 OS。