我被困于捕获键盘事件。
我正在使用被系统检测为传统键盘的条形码扫描仪(这是唯一的模式,我的客户端有很多预算扫描仪无法模拟虚拟com端口)。
我的目标是能够检测到该扫描仪插入哪个端口,捕获来自该端口的任何输入,并防止它被操作系统处理(我不希望条形码数字在聚焦的输入上弹出) )。
所有这些操作必须由后台服务执行,该服务永远都不是活动窗口,并且该解决方案必须在linux和Windows上均可工作。
我已经能够使用 jnativehook 捕获输入,但是无法阻止它被操作系统处理。
据我所知,使用纯Java是不可能做到这一点的(JVM仅在聚焦应用程序窗口时才允许访问键盘事件),那么我应该如何处理此问题?如果有必要,我可以使用jni和c ++,但我不知道从哪里开始。
答案 0 :(得分:2)
JNativeHook确实可以丢弃Windows和OSX(不是Linux)上的事件,但是,它不能确定扫描仪连接到哪个USB端口。它不能在Linux上使用事件的原因是因为XRecord API复制了事件,并且不直接位于输入事件循环中。如果您正在使用的设备可以使用HID,我将研究一些gary-rowe/hid4java或signal11/hidapi之类的JNI HID库包装。断言“使用纯Java无法实现”是正确的。唯一的方法是通过本机代码,而HID是实现目标的最合适的本机方法。其他输入法(如输入挂钩)(由JNativeHook使用)将无法为您提供源USB端口,也无法在某些平台上使用事件(Linux)。还有melloware/jintellitype之类的另一个选项,它使用不同的机制来捕获输入。我认为它不能基于端口获取输入,但是,该库的非便携式Linux等效项使用XGrab API,该API仅消耗事件,但是同样,我不知道对于您的实际情况是否可行输入源,因为我认为每个调用只能绑定一个键,并且该键必须使用修饰符。
希望这可以帮助您继续进行项目。