Робот класса Java, набрав строку вопроса - PullRequest
3 голосов
/ 16 января 2012

Я использую следующий цикл, но он вводит только первый символ, а остальные цифры, понимаете?

import java.awt.*;

import javax.swing.KeyStroke;

public class test {

    public static void main(String[] args) throws AWTException
    {
        Robot r = new Robot();

        String s = "Face";

        for (int i = 0; i < s.length(); i++) 
        {
            char res = s.charAt(i);
            r.keyPress(res);
            r.keyRelease(res);  
            r.delay(1000);
        }           
    }
}

ВЫВОД набрав: F135

Ответы [ 5 ]

10 голосов
/ 16 января 2012

Методы keyPress / Release нуждаются в значении int, представляющем символ, который вы хотите ввести. Эти значения являются кодом ключа для каждого символа, как определено KeyEvent.VK _ ??? переменные.

Попытка:

import java.awt.*;
import java.util.*;
import java.lang.reflect.Field;
import java.awt.event.*;
import javax.swing.*;

public class RobotCharacter
{
    public static void main(String[] args)
        throws Exception
    {
        JTextField textField = new JTextField(10);

        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
        frame.add( textField );
        frame.pack();
        frame.setLocationRelativeTo( null );
        frame.setVisible( true );

        Robot robot = new Robot();
        typeCharacter(robot, "a");
        typeCharacter(robot, "b");
        typeCharacter(robot, "C");
        typeCharacter(robot, "D");
     }

    public static void typeCharacter(Robot robot, String letter)
    {
        try
        {
            boolean upperCase = Character.isUpperCase( letter.charAt(0) );
            String variableName = "VK_" + letter.toUpperCase();

            Class clazz = KeyEvent.class;
            Field field = clazz.getField( variableName );
            int keyCode = field.getInt(null);

            robot.delay(1000);

            if (upperCase) robot.keyPress( KeyEvent.VK_SHIFT );

            robot.keyPress( keyCode );
            robot.keyRelease( keyCode );

            if (upperCase) robot.keyRelease( KeyEvent.VK_SHIFT );
        }
        catch(Exception e)
        {
            System.out.println(e);
        }
    }
}

Однако даже это не будет работать для всех персонажей. Например, на моей клавиатуре «%» выше «5». Вы не можете использовать VK_PERCENT. Нужно нажать клавишу VK_5 вместе со сменой. Нет способа узнать фактическое отображение вашей клавиатуры, чтобы сделать это автоматически.

То есть робот - не лучший способ сделать это.

1 голос
/ 16 января 2012

Класс Robot использует коды клавиш, которые определены здесь: http://docs.oracle.com/javase/1.5.0/docs/api/java/awt/event/KeyEvent.html, не необработанные символы. Вы должны назвать это так:

r.keyPress(KeyEvent.VK_A);
r.keyRelease(KeyEvent.VK_A);
0 голосов
/ 09 марта 2017

Вы можете упростить свою жизнь, если создадите функцию, получающую строку для ввода:

public void keyboardString(final String text) {
    if (text != null) {
        try {
            final Robot robot = new Robot();
            for (int i = 0; i < text.length(); i++) {
                final char ch = text.charAt(i);
                final boolean upperCase = Character.isUpperCase(ch);
                final int keyCode = KeyEvent.getExtendedKeyCodeForChar(ch);
                robot.delay(10);
                if (upperCase) {
                    robot.keyPress(KeyEvent.VK_SHIFT);
                }
                robot.keyPress(keyCode);
                robot.keyRelease(keyCode);
                if (upperCase) {
                    robot.keyRelease(KeyEvent.VK_SHIFT);
                }
            }

        } catch (final Exception e) {
            System.out.println(e);
        }
    }
}
0 голосов
/ 28 июля 2015

Вы также можете загрузить свою строку в буфер обмена и просто вставить ее в любое место.

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

                robo.keyPress(KeyEvent.VK_CONTROL);
                robo.keyPress(KeyEvent.VK_V);
                robo.keyRelease(KeyEvent.VK_V);
                robo.keyRelease(KeyEvent.VK_CONTROL);
0 голосов
/ 29 июня 2012

@ camickr Я внес небольшую правку в ваш текст, чтобы разместить строку, а не букву. Пожалуйста, посмотрите ниже . Мне помогло Спасибо :) Вызов функции: typeCharacter(robot, "thanks");

public static void typeCharacter(Robot robot, String letter)
      {

     for(int i=0;i<letter.length();i++){
      try
      {
          boolean upperCase = Character.isUpperCase( letter.charAt(i) );
          String KeyVal=Character.toString(letter.charAt(i));
          String variableName = "VK_" + KeyVal.toUpperCase();
          Class clazz = KeyEvent.class;
          Field field = clazz.getField( variableName );
          int keyCode = field.getInt(null);

          robot.delay(1000);

          if (upperCase) robot.keyPress( KeyEvent.VK_SHIFT );

          robot.keyPress( keyCode );
          robot.keyRelease( keyCode );

          if (upperCase) robot.keyRelease( KeyEvent.VK_SHIFT );
      }
      catch(Exception e)
      {
          System.out.println(e);
      }
      }

  }
...