Как сделать, чтобы Java.awt.Robot печатал символы юникода? (Является ли это возможным?) - PullRequest
9 голосов
/ 29 декабря 2008

У нас есть предоставленная пользователем строка, которая может содержать символы Юникода, и мы хотим, чтобы робот набрал эту строку.

Как преобразовать строку в ключевые коды, которые будет использовать робот?
Как вы это сделаете, так что это также зависит от версии Java (1.3 -> 1.6)?

То, что мы работаем для символов "ascii" это

//char c = nextChar();
//char c = 'a'; // this works, and so does 'A'
char c = 'á'; // this doesn't, and neither does 'Ă'
Robot robot = new Robot();
KeyStroke key = KeyStroke.getKeyStroke("pressed " + Character.toUpperCase(c) );
if( null != key ) {
  // should only have to worry about case with standard characters
  if (Character.isUpperCase(c))
  {
    robot.keyPress(KeyEvent.VK_SHIFT);
  }

  robot.keyPress(key.getKeyCode());
  robot.keyRelease(key.getKeyCode());

  if (Character.isUpperCase(c))
  {
    robot.keyRelease(KeyEvent.VK_SHIFT);
  }
}

Ответы [ 5 ]

10 голосов
/ 23 февраля 2011

На основе кода javamonkey79 я создал следующий фрагмент кода, который должен работать для всех значений Unicode ...

public static void pressUnicode(Robot r, int key_code)
{
    r.keyPress(KeyEvent.VK_ALT);

    for(int i = 3; i >= 0; --i)
    {
        // extracts a single decade of the key-code and adds
        // an offset to get the required VK_NUMPAD key-code
        int numpad_kc = key_code / (int) (Math.pow(10, i)) % 10 + KeyEvent.VK_NUMPAD0;

        r.keyPress(numpad_kc);
        r.keyRelease(numpad_kc);
    }

    r.keyRelease(KeyEvent.VK_ALT);
}

Это автоматически проходит через каждое десятилетие кода клавиши Unicode, сопоставляет его с соответствующим эквивалентом VK_NUMPAD и соответственно нажимает / отпускает клавиши.

3 голосов
/ 29 декабря 2008

Класс KeyEvent не имеет прямых отображений для многих классов Юникода в JRE 1.5. Если вы запускаете это в Windows, то вам может понадобиться написать собственный обработчик, который выполняет что-то вроде этого:

Robot robot = new Robot();
char curChar = 'Ã';

// -- isUnicode( char ) should be pretty easy to figure out
if ( isUnicode( curChar ) ) {
   // -- this is an example, exact key combinations will vary
   robot.keyPress( KeyEvent.VK_ALT );

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

   // -- have to apply some logic to know what sequence
   robot.keyPress( KeyEvent.VK_0 );
   robot.keyRelease( KeyEvent.VK_0 );
   robot.keyPress( KeyEvent.VK_1 );
   robot.keyRelease( KeyEvent.VK_1 );
   robot.keyPress( KeyEvent.VK_9 );
   robot.keyRelease( KeyEvent.VK_9 );
   robot.keyPress( KeyEvent.VK_5 );
   robot.keyRelease( KeyEvent.VK_5 );

   robot.keyRelease( KeyEvent.VK_ALT );
}

например. Выясните, что это за комбинации клавиш, а затем сопоставьте их с каким-либо объектом (возможно, HashMap?) Для последующего поиска и выполнения.

Надеюсь, это поможет:)

0 голосов
/ 16 апреля 2015

Работает ли это, я пробовал то же самое в ноутбуке, это не похоже на помощь в наборе символов юникода с помощью Java-робота. больше света для того же.

0 голосов
/ 20 июня 2012

Лучший способ найти решение Simulare

import java.awt.AWTException;
import java.awt.Robot;

public class MyRobot {

    public static void typeString(String s)
        {
            try {
            Robot robik = new Robot();
            byte[] bytes = s.getBytes();
            for (byte b : bytes)
            {
                int code = b;
                // keycode only handles [A-Z] (which is ASCII decimal [65-90])
                if (code > 96 && code < 123) code = code - 32;
                robik.delay(40);
                robik.keyPress(code);
                robik.keyRelease(code);
            }
        } catch (AWTException e){

    }
  }

}

http://www.devdaily.com/java/java-robot-class-example-mouse-keystroke\

0 голосов
/ 07 апреля 2010

Я думаю, что немного поздно, но ...

Robot robot = new Robot();

   robot.keyPress( KeyEvent.VK_DEAD_ACUTE);

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

   robot.keyRelease( KeyEvent.VK_DEAD_ACUTE );

, который просто введите "á"

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...