Отправка события клавиатуры с java в любое приложение (экранная клавиатура)

#java #events #swing #keyboard #java-native-interface

Вопрос:

Я работаю над разработкой экранной клавиатуры с java. Эта клавиатура имеет JComponent для каждой возможной клавиши. Когда на кнопке обнаруживается нажатие мыши, я хочу отправить определенный код клавиатуры в приложение, которое в данный момент находится в фокусе. Сама клавиатура находится в пределах а JFrame без каких-либо украшений и установлена в положение «всегда сверху».

Я обнаружил, что класс Robot можно использовать для имитации этих событий клавиатуры в собственной очереди. Однако в этом случае выбор JComponent будет означать, что нажатие клавиши получено на JFrame , и я не смогу получить его в другом приложении

Как я могу сохранить свою экранную клавиатуру «Всегда без фокуса»? Возможно ли использовать другой подход для отправки нажатия клавиши?

Ответ №1:

Я нашел jnativehook, когда пытался управлять игровым ботом с помощью реальных команд клавиатуры и мыши (чтобы быть более «похожим на человека»).

Комментарии:

1. Из описания JNativeHook похоже, что он предназначен для прослушивания событий клавиатуры и мыши, а не для отправки событий в другое приложение.

Ответ №2:

Единственное решение, которое я смог найти до сих пор, — это сделать каждый ключ j-компонентом (чтобы он не мог иметь фокуса) и задать следующие свойства для JFrame:

     setUndecorated(true);
    setFocusableWindowState(false);
    setFocusable(false);
    enableInputMethods(false);
 

Теперь при использовании класса robot я могу отправлять события в любое сфокусированное окно, нажимая на клавиши. Единственное ограничение заключается в том, что он, похоже, работает только для окон, принадлежащих одной и той же виртуальной машине, и он вообще не работает с любым другим системным окном.

Комментарии:

1. Отлично работал в Windows 10, должен быть ответ номер 1, нет необходимости в jni

Ответ №3:

По-видимому, единственный способ сделать это-иметь слой JNI, который будет выполнять преобразование с java на родной язык. В Java нет простого способа обеспечить такую функциональность.

Это может быть интересной концепцией для небольшой сторонней библиотеки для тех, кто хочет изучать JNI…

Ответ №4:

вы пытались вызвать собственные функции setfocus() или setactivewindow() для перемещения фокуса перед использованием класса робота?

Ответ №5:

Я не знаю ни одного способа сделать это независимым от операционной системы способом. Я не знаю о Windows, но можно было бы поговорить с X-сервером по протоколу X.