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

StackOverflow https://stackoverflow.com/questions/156912

Вопрос

Я работаю над разработкой экранной клавиатуры с помощью 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.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top