从特定 USB 端口捕获键盘输入
Capturing keyboard input from specific USB port
我一直在捕获键盘事件。
我正在使用条形码扫描仪,它被系统检测为传统键盘(这是唯一的模式,我的客户有很多无法模拟虚拟 com 端口的预算扫描仪)。
我的目标是能够检测此扫描仪插入哪个端口,捕获来自该端口的任何输入,并防止它被 OS 处理(我不想要条形码重点输入时弹出数字)。
所有这些都必须由后台服务执行,该服务永远不会处于活动状态 window,并且解决方案必须在 linux 和 windows 上都有效。
我已经能够使用 jnativehook 捕获输入,但未能阻止它被 OS 处理。
据我所知,使用纯 java 是不可能实现的(JVM 仅在应用程序 window 获得焦点时才允许访问键盘事件),所以我应该如何处理这个问题?如果有必要,我可以使用 jni 和 c++,但我不知道从哪里开始。
JNativeHook 确实能够丢弃 Windows 和 OSX(不是 Linux)上的事件,但是,它无法确定扫描器是哪个 USB 端口连接到。它不能在 Linux 上使用事件的原因是因为 XRecord API 制作了事件的副本并且不直接位于输入事件循环上。如果您使用的设备可以使用 HID,我会研究一些 JNI HID 库包装器,例如 gary-rowe/hid4java or signal11/hidapi. The assertion that "it is impossible to achieve this using pure java" is correct. The only way to do it would be though native code, and HID is the most appropriate native method to accomplish your goals. Other input methods like input hooking (used by JNativeHook) will not be able to provide you with the source USB port, nor can they consume events on some platforms (Linux). There is another option out there like melloware/jintellitype,它们使用不同的机制来捕获输入。我不认为它可以根据端口获取输入,但是,该库的不可移植 Linux 等价物使用 XGrab API ,它只会消耗事件,但同样,我不知道它是否适用于您的输入源,因为我认为它每次调用只能绑定一个键,并且该键必须使用修饰符。
希望这有助于您推进项目。
我一直在捕获键盘事件。
我正在使用条形码扫描仪,它被系统检测为传统键盘(这是唯一的模式,我的客户有很多无法模拟虚拟 com 端口的预算扫描仪)。
我的目标是能够检测此扫描仪插入哪个端口,捕获来自该端口的任何输入,并防止它被 OS 处理(我不想要条形码重点输入时弹出数字)。
所有这些都必须由后台服务执行,该服务永远不会处于活动状态 window,并且解决方案必须在 linux 和 windows 上都有效。
我已经能够使用 jnativehook 捕获输入,但未能阻止它被 OS 处理。
据我所知,使用纯 java 是不可能实现的(JVM 仅在应用程序 window 获得焦点时才允许访问键盘事件),所以我应该如何处理这个问题?如果有必要,我可以使用 jni 和 c++,但我不知道从哪里开始。
JNativeHook 确实能够丢弃 Windows 和 OSX(不是 Linux)上的事件,但是,它无法确定扫描器是哪个 USB 端口连接到。它不能在 Linux 上使用事件的原因是因为 XRecord API 制作了事件的副本并且不直接位于输入事件循环上。如果您使用的设备可以使用 HID,我会研究一些 JNI HID 库包装器,例如 gary-rowe/hid4java or signal11/hidapi. The assertion that "it is impossible to achieve this using pure java" is correct. The only way to do it would be though native code, and HID is the most appropriate native method to accomplish your goals. Other input methods like input hooking (used by JNativeHook) will not be able to provide you with the source USB port, nor can they consume events on some platforms (Linux). There is another option out there like melloware/jintellitype,它们使用不同的机制来捕获输入。我不认为它可以根据端口获取输入,但是,该库的不可移植 Linux 等价物使用 XGrab API ,它只会消耗事件,但同样,我不知道它是否适用于您的输入源,因为我认为它每次调用只能绑定一个键,并且该键必须使用修饰符。
希望这有助于您推进项目。