2016-05-17 9 views
0

私のプログラムでJNativeHookを使用して、自分のプログラム以外のグローバルキーストロークを検出しています。 これは私が達成するために必要なものです:物理キーを保持し、awt.Robotを使用してJavaの同じキーを自動的に押す

を、私は物理的に押すとにスペースバーを保持し、私は物理的にスペースバーをリリースする前にしようとすると:私は、自動プレスにスペースをawt.Robotクラスを使用したいですスペースバーが物理的に押されている間、ループの中で私のためのバー。

問題への私の理論は、それが物理キーリリース(この場合は、スペースバー。)

ここでは関連性があるかのようJNativeHook NativeKeyListenerがawt.Robot keyRelease()関数を理解するということですコード:私は、スペースキーを押すと、私はそれを保持している場合、その後ORを離すと、このプログラムを実行した後

// 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; 
    } 

} 

。コンソールで毎回同じ出力が得られます。一般的にこのように見えます...

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

アイデアはありますか?

+0

出力は終わりのないループBTWになります。 –

答えて

1

なぜそれをしようとしているのかわかりません...キーを押したままにすると、繰り返しの遅延が経過した後、リリースするまで基本的に繰り返しレートでもキーが下がります。あなたの代わりにキーダウンイベントが繰り返されているのキーが押され、その後解放されたキーバウンス、シミュレートしたい場合:

// 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())); 
    } 

} 

をあなたの上記の例では、あなたが持っている理由はおそらくあるスレッドの安全性の問題をたくさん持っています問題。

+0

私はそれがトピックの方法だと知っていますが、「スレッドの安全性」とは、私のブール変数を意味し、私のメソッドは同期していませんか?私はあなたの意見をお待ちしています。 –

+0

ブーリアンを同期させる必要があります。ロボットスレッドが起動するまで、ネイティブフックコールバックをブロックする必要があります。待機/通知を参照してください。 –

+0

入力いただきありがとうございます。また、スペースバーと一緒に別のキーを押すまで、あなたのメソッドがうまくいくように見えます。スペースキーを押してから "h"キーを押すと、 "バウンス"効果が止まるようです。 –

関連する問題