Отправка события клавиатуры из Java в любое приложение (экранная клавиатура)
-
03-07-2019 - |
Вопрос
Я работаю над разработкой экранной клавиатуры с помощью Java.Эта клавиатура имеет JComponent
для каждого возможного ключа.Когда на кнопке обнаруживается нажатие мыши, я хочу отправить определенный код клавиатуры приложению, которое в данный момент находится в фокусе.Сама клавиатура находится внутри JFrame
без каких-либо украшений и в режиме «всегда на высоте».
Я обнаружил, что класс Robot можно использовать для имитации этих событий клавиатуры в собственной очереди.Однако в этом случае выбор JComponent
будет означать, что нажатие клавиши получено на JFrame
, и я не смогу получить его в другом приложении
Как мне сохранить экранную клавиатуру «Всегда без фокуса»?Возможно ли использовать другой подход для отправки нажатия клавиши?
Решение 3
По-видимому, единственный способ сделать это — иметь уровень JNI, который будет выполнять преобразование из Java в собственный.В Java нет простого способа обеспечить такую функциональность.
Это может быть интересной концепцией для небольшой сторонней библиотеки для тех, кто хочет изучить JNI...
Другие советы
я нашел jnativehook когда я пытался управлять игровым роботом с помощью реальных команд клавиатуры и мыши (чтобы быть более «человечным»).
Единственное решение, которое я смог найти на данный момент, — это сделать каждый ключ JComponent (чтобы он не мог иметь фокуса) и установить следующие свойства для JFrame:
setUndecorated(true);
setFocusableWindowState(false);
setFocusable(false);
enableInputMethods(false);
Теперь при использовании класса робота я могу отправлять события в любое выделенное окно, нажимая на клавиши.Единственное ограничение заключается в том, что он работает только для окон, принадлежащих одной и той же виртуальной машине, и вообще не работает с любым другим системным окном.
Вы пытались вызвать встроенные функции setfocus() или setactivewindow() для перемещения фокуса перед использованием класса робота?
Я не знаю ни одного способа сделать это независимо от ОС.Не знаю, как насчет Windows, но с X-сервером можно было бы поговорить по протоколу X.