2012-03-23 1 views
2

Ich schreibe ein Dienstprogramm zur Bildschirmaufnahme, und ich möchte den aktuellen Zustand von Tastatur und Maus speichern können, wenn ein Screenshot gemacht wird .Wie erhalten Sie den aktuellen Tastaturstatus global? (z. B. welche Tasten gerade gedrückt werden, unabhängig davon, ob die anfragende Anwendung den Fokus hat)

Dies für die Maus zu tun ist einfach, da die Verwendung der PointerInfo Klasse in einer in diesem related question beschriebenen Weise gibt Ihnen die Bildschirmkoordinaten für die aktuelle Mausposition und die Klickinformation, falls gewünscht. Ich konnte jedoch kein Analog zu dieser Klasse für die Tastatur finden; Alle tastaturbezogenen Klassen scheinen fokusspezifisch zu sein.

Gibt es also eine Möglichkeit, den aktuellen Tastaturstatus in Java zu erhalten?

P.S. Denken Sie daran, dass ich nach einer Funktion suche, um die Informationen darüber abzurufen, welche Tasten gedrückt sind, und einen Hörer für solche Depressionsereignisse.

Antwort

5

Etwas, das Sie tun können, ist die KeyListener-Schnittstelle implementieren und geben Zustände zu allen Tasten, die Sie interessieren.

Wenn Sie bei der Prüfung interessiert sind, wenn Sie die Pfeiltasten auf einem Screenshot gedrückt werden, zum Beispiel, Sie können diese KeyListener Schnittstelle implementieren und die Methoden keyPressed() und keyReleased() überschreiben und den Status für die Schlüssel, an denen Sie interessiert sind, auf keyPressed oder keyReleased setzen. Abhängig von der Veranstaltung. Wenn der Screenshot auftritt, können Sie einfach den Status dieser Schlüssel lesen

Wenn Sie diese Lösung global unabhängig vom Anwendungsfokus benötigen, können Sie einen kleinen Haken in C schreiben, den Sie in Java Native integrieren können Schnittstelle zum Abhören wichtiger Ereignisse. Java lässt Sie keine Schlüsselereignisse abhören, ohne dass Sie den Listener an eine Komponente und die Komponente mit Fokus gebunden haben. Schauen Sie sich JNativeHook an.

Wenn Sie es nur brauchen, wenn Ihre Anwendung den Fokus hat, aber auf jeder Komponente, können Sie den Listener unelegant an alle Ihre Komponenten anhängen oder Sie könnten Ihren eigenen KeyEventDispatcher schreiben und ihn im KeyBoardFocusManager registrieren. Auf diese Weise können Sie alle Tastaturereignisse abfangen, unabhängig davon, welche Komponente einen bestimmten Fokus hat. Siehe:

public class YourFrame extends JFrame {  

    public YourFrame() { 
     // Finish all your layout and add your components 
     // 

     // Get the KeyboardFocusManager and register your custom dispatcher 
     KeyboardFocusManager m = KeyboardFocusManager.getCurrentKeyboardFocusManager(); 

     m.addKeyEventDispatcher(new YourDispatcher()); 
    } 

    private class YourDispatcher implements KeyEventDispatcher { 
     @Override 
     public boolean dispatchKeyEvent(KeyEvent e) { 
      if (e.getID() == KeyEvent.KEY_TYPED) { 
       // Do something to change the state of the key 
      } else if (e.getID() == KeyEvent.KEY_PRESSED) { 
       // Do something else 
      } 
      return false; 
     } 
    } 

    public static void main(String[] args) { 
     YourFrame yF = new YourFrame(); 
     yF.pack(); 
     yF.setVisible(true); 
    } 
} 
+0

Danke für die schnelle Antwort! Ich werde es jetzt ausprobieren - klingt, als sollte es funktionieren. – zergylord

+0

Das Lesen der Schnittstelle lässt es so klingen, dass es nur die Schlüssel abfängt, wenn eine bestimmte J-Komponente den Fokus hat, was ich nicht suche. Ich möchte auf Tasten gedrückt * global * aka unabhängig von Fokus hören. Gibt es einen Weg für Ihre vorgeschlagene Lösung, dies zu tun? – zergylord

+0

Ich glaube nicht, dass Java Ihnen diese Art von Kontrolle geben wird - dh die Implementierung eines KeyListeners unabhängig vom Anwendungsfokus. Der beste Weg wäre, einen globalen Listener in einer Sprache zu schreiben, die näher an dem von Ihnen verwendeten Betriebssystem ist, wie C. Verwenden Sie dann Java Native Interface für die Integration mit den Schlüsselereignissen von C. – ugo

Verwandte Themen