2016-05-17 2 views
0

Ich benutze JNativeHook in meinem Programm, um globale Tastenanschläge außerhalb meines Programms zu erkennen. Diese ist, was ich brauche zu erreichen:Halte einen physischen Schlüssel und benutze dann awt.Robot, um automatisch dieselbe Taste in Java zu drücken.

wenn ich versuche, körperlich zu betätigen und halten die Leertaste, und bevor ich physisch die Leertaste loslassen: Ich möchte den Raum, um die awt.Robot Klasse Auto nutzen, drücken Bar für mich in einer Schleife, während die Leertaste gedrückt wird.

auf das Problem Meine Theorie ist, dass die JNativeHook NativeKeyListener die awt.Robot keyRelease() Funktion versteht, als ob es sich um eine physischen Schlüsselhilfsentriegelung (in diesem Fall die Leertaste.)

Hier ist der relevante war Code:

// These are the global variables 
// ... 
Robot robot; // Initialized in the constructor 
// ... 
boolean spaceDown = false; 
boolean activeThread = false; 

private void pressSpace(){ 

    robot.keyPress(KeyEvent.VK_SPACE); 
    robot.delay(20); 
    robot.keyRelease(KeyEvent.VK_SPACE); 
    robot.delay(30); 

    System.out.println("Robot - Press/Release"); 

} 

private void executeThread(){ 

    new Thread(){ 
     public void run(){ 
      while(spaceDown){ 
       pressSpace(); 
      } 
      activeThread = false; 
     } 
    }.start(); 

} 

public void nativeKeyPressed(NativeKeyEvent e){ 

    if(e.getKeyCode() == NativeKeyEvent.VC_SPACE){ 

     System.out.println("Physical - Pressed"); 

     activeThread = true; 
     spaceDown = true; 
     if(activeThread){ 
      executeThread(); 
     } 
    } 

} 
public void nativeKeyReleased(NativeKeyEvent e){ 

    if(e.getKeyCode() == NativeKeyEvent.VC_SPACE){ 
     System.out.println("Physical - Released"); 
     spaceDown = false; 
    } 

} 

Nach dem Ausführen dieses Programms, wenn ich die Leertaste drücken und dann OR freigeben, wenn ich es halten. Ich bekomme die gleiche Ausgabe jedes Mal in der Konsole. Es sieht im Allgemeinen so aus ...

... 
Physical - Pressed 
Physical - Released 
Robot - Press/Release 
Physical - Pressed 
Physical - Released 
Robot - Press/Release 
... 

Irgendwelche Ideen?

+0

Der Ausgang geht auf eine nie endende Schleife BTW. –

Antwort

1

Ich bin mir nicht sicher, warum Sie das versuchen ... Wenn Sie eine Taste gedrückt halten, nachdem die Wiederholungsverzögerung verstrichen ist, erhalten Sie eine Taste sogar bei der Wiederholungsrate, bis Sie loslassen. Wenn Sie einen Schlüssel Bounce simulieren möchten, wo die Taste gedrückt und dann losgelassen, statt eines Schlüssels nach unten Ereignis wiederholt werden:

// These are the global variables 
public void nativeKeyPressed(NativeKeyEvent e){ 

    if(e.getKeyCode() == NativeKeyEvent.VC_SPACE){ 

     System.out.println("Physical - Pressed"); 

     // This should produce a key release event. 
     GlobalScreen.postNativeEvent(new NativeKeyEvent(
      NativeKeyEvent.NATIVE_KEY_RELEASED, 
      e.getWhen(), 
      e.getModifiers(), 
      e.getRawCode(), 
      e.getKeyCode, 
      e.getKeyChar(), 
      e.getKeyLocation())); 
    } 

} 

über Ihr Beispiel viel Faden Sicherheitsfragen hat was wahrscheinlich ist, warum haben Sie ein Problem.

+0

Ich weiß, es ist Thema, aber durch "Thread-Sicherheit" meinst du meine booleschen Variablen und meine Methoden sind nicht synchronisiert? Ich möchte Ihre Eingabe dazu. –

+0

Sie müssen Ihre booleschen Werte synchronisieren, und Sie möchten wahrscheinlich den nativen Hook-Callback blockieren, bis der Roboter-Thread ausgelöst wird. Siehe Warten/Benachrichtigen. –

+0

Danke für die Eingabe, werde ich tun. Auch ein Problem, scheint Ihre Methode zu arbeiten, bis ich eine andere Taste zusammen mit der Leertaste drücken. Wenn ich die Leertaste drücke und dann die Taste "h" drücke, scheint der "Bounce" -Effekt zu stoppen. –

Verwandte Themen