web-dev-qa-db-fra.com

Tapez une chaîne en utilisant Java.awt.Robot

Je sais déjà comment utiliser Java.awt.Robot pour taper un seul caractère à l'aide de keyPress, comme indiqué ci-dessous. Comment puis-je simplement entrer un entier prédéfini String valeur à la fois dans une zone de texte? 

robot.keyPress(KeyEvent.VK_1);
robot.keyPress(KeyEvent.VK_1);
robot.keyPress(KeyEvent.VK_1);  
// instead, enter String x = "111"
21
user1196937

La solution courante consiste à utiliser le presse-papiers:

String text = "Hello World";
StringSelection stringSelection = new StringSelection(text);
Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard();
clipboard.setContents(stringSelection, stringSelection);

Robot robot = new Robot();
robot.keyPress(KeyEvent.VK_CONTROL);
robot.keyPress(KeyEvent.VK_V);
robot.keyRelease(KeyEvent.VK_V);
robot.keyRelease(KeyEvent.VK_CONTROL);
35
Eng.Fouad

Vous devez "taper" le caractère, qui est une action presse ET relâche ...

robot.keyPress(KeyEvent.VK_1);  
robot.keyRelease(KeyEvent.VK_1);  

Maintenant, vous pouvez simplement copier et coller trois fois, mais je voudrais simplement le mettre en boucle

6
MadProgrammer

Depuis Java 7, vous pouvez également utiliser KeyEvent.getExtendedKeyCodeForChar (c). Un exemple pour les minuscules seulement pourrait être:

void sendKeys(Robot robot, String keys) {
    for (char c : keys.toCharArray()) {
        int keyCode = KeyEvent.getExtendedKeyCodeForChar(c);
        if (KeyEvent.CHAR_UNDEFINED == keyCode) {
            throw new RuntimeException(
                "Key code not found for character '" + c + "'");
        }
        robot.keyPress(keyCode);
        robot.delay(100);
        robot.keyRelease(keyCode);
        robot.delay(100);
    }
}
4
geri

Vous pouvez entrer une valeur dans une chaîne et vous pouvez ensuite utiliser cette chaîne comme expliqué par Eng.Fouad. Mais il n’ya aucun plaisir à l’utiliser, vous pouvez essayer ceci 

Robot robot = new Robot();
robot.keyPress(KeyEvent.VK_H);
robot.keyRelease(KeyEvent.VK_H);
robot.keyPress(KeyEvent.VK_E);
robot.keyRelease(KeyEvent.VK_E);
robot.keyPress(KeyEvent.VK_L);
robot.keyRelease(KeyEvent.VK_L);
robot.keyPress(KeyEvent.VK_L);
robot.keyRelease(KeyEvent.VK_L);
robot.keyPress(KeyEvent.VK_O);
robot.keyRelease(KeyEvent.VK_O);

et vous pouvez également utiliser Thread.sleep pour qu’il puisse entrer le bit de données lentement.

3
Luffy

Je pense que j'ai implémenté une meilleure âme, peut-être que quelqu'un l'a trouvé utile (la principale approche consiste à lire toutes les valeurs de enum KeyCode et à le mettre dans un HashMap et à l'utiliser plus tard pour trouver un code de clé int)

public class KeysMapper {

    private static HashMap<Character, Integer> charMap = new HashMap<Character, Integer>();

    static {
        for (KeyCode keyCode : KeyCode.values()) {
            if (keyCode.impl_getCode() >= 65 && keyCode.impl_getCode() <= 90){
                charMap.put(keyCode.getName().toLowerCase().toCharArray()[0], keyCode.impl_getCode());
            }
            else{
                charMap.put(keyCode.getName().toLowerCase().toCharArray()[0], keyCode.impl_getCode());
            }
        }
    }
    public static Key charToKey(char c){
        if(c>=65 && c<=90){
            return new Key(charMap.get(c), true);
        } else {
            return new Key(charMap.get(c), false);
        }
    }

    public static List<Key> stringToKeys(String text){
        List<Key> keys = new ArrayList<Key>();
        for (char c : text.toCharArray()) {
            keys.add(charToKey(c));
        }
        return keys;
    }

J'ai également créé une classe de clé pour savoir s'il faut taper un caractère majuscule ou minuscule:

public class Key {

    int keyCode;
    boolean uppercase;

//getters setter constructors}

et finalement vous pouvez l'utiliser comme ça (pour un seul caractère) robot.keyPress(charToKey('a').getKeyCode()); Si vous voulez appuyer sur une majuscule, vous devez appuyer simultanément sur la touche Maj et la relâcher

1
Adrian Kapuscinski
    StringSelection path = new StringSelection("path of your document ");

    // create an object to desktop

    Toolkit tol = Toolkit.getDefaultToolkit();

    // get control of mouse cursor

    Clipboard c = tol.getSystemClipboard();

    // copy the path into mouse
    c.setContents(path, null);

    // create a object of robot class

    Robot r = new Robot();

    r.keyPress(KeyEvent.VK_CONTROL);
    r.keyPress(KeyEvent.VK_V);
    r.keyRelease(KeyEvent.VK_CONTROL);
    r.keyRelease(KeyEvent.VK_V);
    r.keyPress(KeyEvent.VK_ENTER);
    r.keyRelease(KeyEvent.VK_ENTER);

}
1
Jagdish Odedra

Cela ne tape pas la "chaîne" entière mais aide à taper tout ce que vous voulez, sauf un caractère à la fois.

    Runtime.getRuntime().exec("notepad.exe");//or anywhere you want.
   Thread.sleep(5000);//not required though gives a good feel.
    Robot r=new Robot();      
     String a="Hi My name is Whatever you want to say.";
    char c;
     int d=a.length(),e=0,f=0;

     while(e<=d)
    {
     c=a.charAt(e);
     f=(int) c; //converts character to Unicode. 
      r.keyPress(KeyEvent.getExtendedKeyCodeForChar(f));
     e++;
       Thread.sleep(150);

       }

voyez cela fonctionne parfaitement et c'est génial! Bien que cela ne fonctionne pas pour les caractères spéciaux qui ne peuvent pas être suivis par unicode comme |,! ... etc. 

0
Abhilash Messi