Atajo de teclado de todo el sistema Java

¿Hay alguna manera de obtener un atajo de teclado de todo el sistema (global) para realizar una acción en una aplicación Java?

¿Alguna vinculación AWT / Swing?

No hay, pero en Windows puedes usar esto:

jintellitype

Desafortunadamente no hay nada que yo sepa para Linux y OSX, probablemente es por eso que no viene con Java desde el primer momento.

Si encuentra las otras plataformas, publíquelo aquí, por favor 🙂

Solo por couriosity, ¿qué estás haciendo con eso?

Soy el autor de JIntellitype y puedo decirles que esto debe hacerse de manera nativa en DLL y ser invocado desde Java JNI tal como JIntellitype lo hace. Este es un gancho de nivel de sistema operativo que no está implementado en el JDK, por lo que se deben usar bibliotecas como JIntellitype y jxGrabKey. Por lo que sé, nadie ha escrito uno para OSX todavía.

JIntellitype es de código abierto en Github, así que si quieres una idea de cómo funciona, solo echa un vistazo al código fuente

Acabo de encontrar https://github.com/kwhat/jnativehook

Parece ser una plataforma cruzada.

Aquí está su código de muestra para escuchar las pulsaciones de teclas:

import org.jnativehook.GlobalScreen; import org.jnativehook.NativeHookException; import org.jnativehook.keyboard.NativeKeyEvent; import org.jnativehook.keyboard.NativeKeyListener; public class GlobalKeyListenerExample implements NativeKeyListener { public void nativeKeyPressed(NativeKeyEvent e) { System.out.println("Key Pressed: " + NativeKeyEvent.getKeyText(e.getKeyCode())); if (e.getKeyCode() == NativeKeyEvent.VC_ESCAPE) { GlobalScreen.unregisterNativeHook(); } } public void nativeKeyReleased(NativeKeyEvent e) { System.out.println("Key Released: " + NativeKeyEvent.getKeyText(e.getKeyCode())); } public void nativeKeyTyped(NativeKeyEvent e) { System.out.println("Key Typed: " + e.getKeyText(e.getKeyCode())); } public static void main(String[] args) { try { GlobalScreen.registerNativeHook(); } catch (NativeHookException ex) { System.err.println("There was a problem registering the native hook."); System.err.println(ex.getMessage()); System.exit(1); } GlobalScreen.addNativeKeyListener(new GlobalKeyListenerExample()); } } 

La comprobación de modificadores se basa en máscaras de bits (cosas que todos deberíamos saber pero siempre olvidamos :-P):

  boolean isAltPressed = (e.getModifiers() & NativeKeyEvent.ALT_MASK) != 0; boolean isShiftPressed = (e.getModifiers() & NativeKeyEvent.SHIFT_MASK) != 0; 

Esto se puede combinar con KeyCode:

 if (e.getKeyCode() == NativeKeyEvent.VK_2 && isShiftPressed && isAltPressed){...} 

Este es un ejemplo modificado de aquí

También debe modificar el comportamiento de registro predeterminado, de lo contrario, enviará spam a la consola:

 // Get the logger for "org.jnativehook" and set the level to warning. Logger logger = Logger.getLogger(GlobalScreen.class.getPackage().getName()); logger.setLevel(Level.WARNING); // Don't forget to disable the parent handlers. logger.setUseParentHandlers(false); 

El ejemplo del código es de aquí

ACTUALIZACIÓN: No sé si puede enlazar eventos desde FUERA de la JVM. Creo que un componente Swing / AWT debe tener foco para que esto funcione.

Querrá conectar la cola de eventos de Java AWT para estar absolutamente seguro de que puede obtener una pulsación de tecla global (jvm de ancho).

Utilizar

 EventQueue ev = Toolkit.getSystemEventQueue(); // MyCustomEventQueue extends EventQueue and processes keyboard events in the dispatch ev.push(new MyCustomEventQueue()); class MyEventQueue extends EventQueue { protected void dispatchEvent(AWTEvent event) { // all AWTEvents can be indentified by type, KeyEvent, MouseEvent, etc // look for KeyEvents and match against you hotkeys / callbacks } } 

Creo que puede haber otras formas de realizar pulsaciones de teclas globales con mapas de acción. De hecho, he usado el mether anterior

Para Windows necesita un dll de gancho de teclado. Puede inicializar su dll desde Java, lo que hará que registre el oyente. Obtendrás lo que necesitas. Verifique msdn para conocer los ganchos de dll o los ganchos de teclado. Uno de esos debería prepararte.

Para Linux, creo que esto debería ser más fácil, pero nunca lo he hecho yo mismo.

http://ubuntuforums.org/showthread.php?t=864566

El primer resultado de Google para “Linux escucha las pulsaciones de teclas globales” (sin comillas) aparece algo que creo que te ayudará en los entornos X11

OSX podría ser capaz de usar una solución cercana a esto. Pero al final, es probable que necesite una dll para cada plataforma, a menos que JNA pueda hacer esto sin problemas, entonces lo peor ya está hecho.

JDIC (Java Desktop Integration) podría ayudar
https://jdic.dev.java.net/

Parece ser un poco perdido para mí. No estoy seguro.
Si alguien sabe más, ¡por favor informe!
También estoy muy interesado en esta característica.

Intereting Posts