teclado tecla keyreleased eventos evento esperar con activar java events swing keyboard jni

java - tecla - keyreleased en netbeans



Enviar un evento de teclado desde Java a cualquier aplicaciĆ³n(teclado en pantalla) (5)

¿Has intentado llamar a las funciones nativas setfocus () o setactivewindow () para mover el foco antes de usar la clase de robot?

Estoy trabajando en desarrollar un teclado en pantalla con Java. Este teclado tiene un JComponent para cada tecla posible. Cuando se detecta un mouse hacia abajo en el botón, quiero enviar un código de teclado específico a la aplicación actualmente en foco. El teclado está dentro de un JFrame sin decoraciones y configurado para siempre en la parte superior.

Descubrí que la clase Robot se puede usar para simular estos eventos de teclado en la cola nativa. Sin embargo, en este caso, seleccionar JComponent significaría que la pulsación de tecla se recibe en el JFrame , y no podría recibirlo en la otra aplicación

¿Cómo puedo mantener mi teclado en pantalla "Siempre sin foco"? ¿Es posible utilizar otro enfoque para enviar la pulsación de tecla?


Aparentemente, la única forma de hacerlo es tener una capa JNI que haga la conversión de Java a nativo. Java no tiene una manera fácil de proporcionar dicha funcionalidad.

Este podría ser un concepto interesante para una pequeña biblioteca de terceros para alguien que quiere aprender JNI ...


Encontré jnativehook cuando estaba tratando de controlar un gamebot con los comandos reales del teclado y el mouse (para ser más "humano").


La única solución que pude encontrar hasta ahora es convertir cada clave en JComponent (por lo que no puede tener foco) y establecer las siguientes propiedades en JFrame:

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

Ahora, cuando utilizo la clase de robot, puedo enviar eventos a cualquier ventana enfocada haciendo clic en las teclas. La única limitación es que solo parece funcionar para ventanas que pertenecen a la misma máquina virtual, y no funciona en absoluto con ninguna otra ventana del sistema.


No estoy al tanto de ninguna forma de hacerlo en forma independiente del sistema operativo. No sé sobre Windows, pero sería posible hablar con el servidor X sobre el protocolo X.