2009-04-24 10 views
3

Javaで短時間キーボードのキーを押し続けるという動作をシミュレートしようと考えています。次のコードでは、Aキーを5秒間押し続けることを期待していますが、メモ帳でテストするときには1つの 'a'が生成されます。何か他のものを使う必要があるかどうか、あるいはここで間違ったawt.Robotクラスを使用しているのであれば?Javaで押されたキーをシミュレートします

Robot robot = null; 
robot = new Robot(); 
robot.keyPress(KeyEvent.VK_A); 
Thread.sleep(5000); 
robot.keyRelease(KeyEvent.VK_A); 

答えて

4

Thread.sleep()は、現在のスレッド(キーを押し続けているスレッド)の実行を停止します。

一定の時間キーを押したままにしたい場合は、並列スレッドで実行する必要があります。ここで

は(あなたが他のコマンドを作成し、意志で内外にそれらを交換することができますので、コマンドパターンを使用しています)のThread.sleep()の問題を回避します提案です:

public class Main { 

public static void main(String[] args) throws InterruptedException { 
    final RobotCommand pressAKeyCommand = new PressAKeyCommand(); 
    Thread t = new Thread(new Runnable() { 

     public void run() { 
      pressAKeyCommand.execute(); 
     } 
    }); 
    t.start(); 
    Thread.sleep(5000); 
    pressAKeyCommand.stop(); 

    } 
} 

class PressAKeyCommand implements RobotCommand { 

private volatile boolean isContinue = true; 

public void execute() { 
    try { 
     Robot robot = new Robot(); 
     while (isContinue) { 
      robot.keyPress(KeyEvent.VK_A); 
     } 
     robot.keyRelease(KeyEvent.VK_A); 
    } catch (AWTException ex) { 
     // Do something with Exception 
    } 
} 

    public void stop() { 
    isContinue = false; 
    } 
} 

interface RobotCommand { 

    void execute(); 

    void stop(); 
} 
0

java.lang.RobotにはkeyDownイベントはありません。私は自分のコンピュータでこれを試してみました(メモ帳ではなくlinuxのコンソールでテストしています)、うまくいきました。おそらくこれはノートパッドの単なる問題ですか?

+0

あなたはそうです。オンラインのjavaドキュメントを見ると、keyPressはキーを押すために使用され、keyReleaseは同じキーを解放するために使用されます。私は問題がthread.sleep()であると思う。 –

1

だけ押し続けます?

import java.awt.Robot; 
import java.awt.event.KeyEvent; 

public class PressAndHold { 
    public static void main(String [] args) throws Exception { 
     Robot robot = new Robot(); 
     for(int i = 0 ; i < 10; i++) { 
      robot.keyPress(KeyEvent.VK_A); 
     } 
    } 
} 

私はエドワードによって提供される答えがすると思います!

関連する問題