Pregunta

Estoy trabajando en el desarrollo de 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, deseo enviar un código de teclado específico a la aplicación actualmente enfocada. El teclado en sí está dentro de un JFrame sin decoraciones y configurado siempre en la parte superior.

Encontré que la clase de 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 la tecla se recibe en el JFrame , y no podré recibirla en la otra aplicación

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

¿Fue útil?

Solución 3

Aparentemente, la única forma de hacer esto es tener una capa JNI que realice la conversión de java a nativo. Java no tiene una manera fácil de proporcionar tal funcionalidad.

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

Otros consejos

Encontré jnativehook cuando intentaba 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 hacer que cada clave sea un JComponent (para que no se pueda enfocar), y establecer las siguientes propiedades en el JFrame:

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

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

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

No tengo conocimiento de ninguna forma de hacerlo de forma independiente. No sé sobre Windows, pero sería posible hablar con el servidor X a través del protocolo X.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top