2010-08-26 11 views
3

Comment puis-je capturer la souris dans une application Java afin que tous les événements de la souris (même ceux qui se produisent si la souris est déplacée en dehors de la fenêtre de l'application) sont vus par l'application Java? C'est comme la fonction Windows SetCapture.capture de souris java

Répondre

3

Vous ne le faites pas; la JVM, ou plus précisément AWT, ne génère que des événements d'entrée lorsque Windows lui envoie des événements d'entrée, et la JVM ne s'enregistre que pour les événements qui se produisent dans sa fenêtre.

Vous pourriez être en mesure de le retirer en utilisant JNI, mais encore une fois vous ne pourriez pas - cela dépendra si vous pouvez obtenir les mains sur les informations requises par l'API sous-jacente. Comme ce sera probablement un handle de fenêtre, vous n'aurez pas ce dont vous avez besoin pour appeler l'API, même depuis JNI.

1

Vous devez placer la souris au niveau du système d'exploitation. Windows (Swing, AWT, MFC, etc ....) sont seulement conscients des mouvements de la souris dans leurs limites. Si vous avez besoin d'un moyen d'accéder à la position actuelle de la souris, quel que soit l'emplacement de la souris sur l'écran, vous devez écrire un crochet d'entrée: Input Hooks. Vous pouvez ensuite utiliser JNI ou lire le STDOUT à partir d'une application de console win32 conçue pour utiliser le crochet d'entrée pour transmettre les événements/positions de la souris à votre code Java. J'utilise la dernière méthode dans certains de mes cas de test d'interface utilisateur avec succès.

0

J'avais besoin de faire ça aussi! Après avoir cherché sur le web, j'ai trouvé qu'il était possible d'utiliser moveMouse dans java.awt.Robot.

Fondamentalement utiliser Robot pour déplacer la souris au centre de votre image. Si l'utilisateur le déplace: vérifiez combien et replacez-le au centre.

Aucun paquet supplémentaire ou JNI n'est nécessaire pour cela (ma démo utilise JOGL et vecmath mais c'est pour les graphiques). Est-ce suffisant? Essayez la démo, son ici:

http://www.eit.se/hb/misc/java/examples/FirstPersonJavaProtoGame/

Si la solution ci-dessus n'est pas assez bon alors peut-être LWJGL est ce que vous avez besoin:

http://www.lwjgl.org/javadoc/org/lwjgl/input/Mouse.html

/Henrik Björkman

0

Il suffit d'utiliser la bibliothèque de hook système disponible sur gitHub https://github.com/kristian/system-hook

y aux systèmes basés sur Windows, mais très simple à mettre en œuvre.

utilisation d'échantillons

import lc.kra.system.keyboard.GlobalKeyboardHook; 
import lc.kra.system.keyboard.event.GlobalKeyAdapter; 
import lc.kra.system.keyboard.event.GlobalKeyEvent; 

public class GlobalKeyboardExample { 
    private static boolean run = true; 
    public static void main(String[] args) { 
     // might throw a UnsatisfiedLinkError if the native library fails to load or a RuntimeException if hooking fails 
     GlobalKeyboardHook keyboardHook = new GlobalKeyboardHook(); 

     System.out.println("Global keyboard hook successfully started, press [escape] key to shutdown."); 
     keyboardHook.addKeyListener(new GlobalKeyAdapter() { 
      @Override public void keyPressed(GlobalKeyEvent event) { 
       System.out.println(event); 
       if(event.getVirtualKeyCode()==GlobalKeyEvent.VK_ESCAPE) 
        run = false; 
      } 
      @Override public void keyReleased(GlobalKeyEvent event) { 
       System.out.println(event); } 
     }); 

     try { 
      while(run) Thread.sleep(128); 
     } catch(InterruptedException e) { /* nothing to do here */ } 
      finally { keyboardHook.shutdownHook(); } 
    } 
}