2009-08-16 5 views
1

Est-il possible d'être averti des événements clés au niveau d'une application et non au niveau d'un composant? Ce que je veux dire par niveau d'application est de ne pas avoir un composant swing recevant des événements clés, mais d'avoir une classe spéciale écouter les événements clés du système.Evénements clés au niveau de l'application en Java

Ceci peut être utilisé dans une application sans interface graphique par exemple ou lorsqu'un traitement plus global des événements clés est nécessaire.

+0

Vous devez être plus précis sur ce que les événements que vous souhaitez écouter. A propos de la seule universelle que je peux penser est l'arrêt. –

Répondre

0

Vous ne savez pas si c'est possible en Java natif: sous Windows, vous devez créer une DLL pour accrocher les événements clés au niveau système (global), je suppose que c'est un mécanisme différent sous Unix ou MacOS. interface avec l'API système de bas niveau pour y parvenir.

+0

ce processus est difficile? Je n'ai aucune expérience avec la programmation win32 j'ai peur. –

-1

Les signaux ne sont pas un concept universel, mais certains signaux comme ctrl + c pour l'arrêt sont très répandus s'ils ne sont pas utilisés partout. Ce signal particulier peut être écouté en utilisant un crochet d'arrêt. L'appel de Runtime.addShutdownHook (Thread) vous permettra de savoir quand la VM est fermée pour une raison quelconque et de faire quelque chose sur cet événement.

2

Vous pouvez ajouter un écouteur d'événement global à votre application à l'aide de la méthode addAWTEventListener() dans java.awt.Toolkit.

http://java.sun.com/javase/6/docs/api/java/awt/Toolkit.html#addAWTEventListener%28java.awt.event.AWTEventListener,%20long%29

Bien sûr, cela ne fonctionne que lorsque votre application a le focus.

Donc, pour les événements clés que vous pouvez utiliser:

public class MyGlobalKeyListener implements AWTEventListener { 
    public void eventDispatched(AWTEvent event) { 
     // do something here 
    } 
} 

// Then on startup register. 
AWTEventListener myGlobalKeyListener = new MyGlobalKeyListener(); 

Toolkey.getDefaultToolkit().addAWTEventListener(myGlobalKeyListener, AWTEvent.KEY_EVENT_MASK); 
+0

hm ... alors que se passe-t-il si je n'ai pas d'interface graphique pour gagner des focs en premier lieu? –

+0

S'il n'y a pas d'interface graphique, vous ne pouvez pas avoir d'événement KeyEvents depuis AWT. La seule entrée utilisateur pour le clavier sans interface graphique provient directement du flux System.in qui reçoit les caractères tapés dans la console. Si vous avez besoin de capturer des événements même si votre application n'a pas de focus, je pense que vous devrez utiliser JNI pour accéder aux hooks au niveau du système d'exploitation comme suggéré par PhiLho. – Aaron

Questions connexes