Отправка события клавиатуры из Java в любое приложение (экранная клавиатура) - PullRequest
4 голосов
/ 01 октября 2008

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

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

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

Ответы [ 5 ]

3 голосов
/ 12 января 2012

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

2 голосов
/ 20 октября 2008

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

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

2 голосов
/ 09 октября 2008

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

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

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

0 голосов
/ 11 октября 2008

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

0 голосов
/ 01 октября 2008

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

...