Захват ввода с клавиатуры через определенный порт USB - PullRequest
1 голос
/ 28 сентября 2019

Я застреваю при захвате событий клавиатуры.

Я работаю со сканером штрих-кода, который распознается системой как традиционная клавиатура (это единственный режим, у моего клиента много бюджетных сканеров, которыене может эмулировать виртуальный COM-порт).

Моя цель - определить, к какому порту подключен этот сканер, захватить любой вход с этого порта и предотвратить его обработку операционной системой (я не хочу, чтобы номера штрих-кодов появлялись при сфокусированном вводе).

Все это должно выполняться фоновой службой, которая никогда не является активным окном, И решение должно работать как в Linux, так и в Windows.

Мне удалось захватить ввод с помощью jnativehook , но не удалось предотвратить его обработку операционной системой.

Насколько я знаю, невозможнодобиться этого с помощью чистой Java (JVM дает доступ к событиям клавиатуры только тогда, когда окно приложения сфокусировано), так как мне решить эту проблему?Я в порядке, используя jni и c ++, если это необходимо, но я не знаю, с чего начать.

1 Ответ

1 голос
/ 28 сентября 2019

JNativeHook имеет возможность сбрасывать события в Windows и OSX (не в Linux), однако он не может определить, к какому USB-порту подключен сканер.Причина, по которой он не может использовать события в Linux, заключается в том, что API XRecord делает копию событий и не размещается непосредственно в цикле ввода событий.Если устройства, с которыми вы работаете, могут использовать HID, я бы взглянул на некоторые из библиотечных оболочек JNI HID, таких как gary-rowe / hid4java или signal11 / hidapi .Утверждение, что «это невозможно сделать, используя чистую Java», является правильным.Единственный способ сделать это - использовать нативный код, а HID - наиболее подходящий нативный метод для достижения ваших целей.Другие методы ввода, такие как перехват ввода (используемый JNativeHook), не смогут предоставить вам исходный USB-порт и не могут использовать события на некоторых платформах (Linux).Существует еще одна опция, например melloware / jintellitype , которая использует другой механизм для ввода ввода.Я не думаю, что он может получить ввод на основе порта, однако непереносимый эквивалент этой библиотеки для Linux использует XGrab API, который будет принимать только события, но, опять же, я не знаю, будет ли это практичным для вашегоисточник ввода, так как я думаю, что он может связывать только одну клавишу на вызов, и эта клавиша должна использовать модификатор.

Надеюсь, это поможет вам продвинуться вперед в вашем проекте.

...