Как сделать символы Unicode типа Java.awt.Robot? (Является ли это возможным?)

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

Как преобразовать строку в коды клавиш, которые робот будет использовать?
Как это сделать, чтобы он также не зависел от версии 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);
  }
}

Может быть, вы можете поместить строку в буфер обмена и отправить Ctrl + V

Yaocl 07.08.2014 05:15

@Yaocl Это, безусловно, еще один способ получить информацию о том, что принимает «вставку», иногда это недоступно.

Greg Domjan 08.08.2014 19:59

См. Также stackoverflow.com/a/14766664/34088 для хорошего решения

Aaron Digulla 29.12.2014 20:05
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
11
3
14 820
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

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?) Для последующего поиска и выполнения.

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

Учи, я надеялся на попроще, но это обязательно поможет.

Greg Domjan 29.12.2008 09:07

Я обнаружил, что вам не нужен KeyEvent.VK_NUMBER_SIGN. Также, что числа нужно вводить, как будто с цифровой клавиатуры, т.е. KeyEvent.VK_NUMPAD0.

Greg Domjan 30.12.2008 04:05

@Greg: Я подумал, что вам придется поиграться с точной конфигурацией, чтобы все получилось. Просто предложение, но вы также можете попробовать преобразовать char в int, затем в String, а затем в массив char, чтобы вы могли анализировать каждый из них ... просто мысль.

javamonkey79 31.12.2008 08:36

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

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 );

просто введите "á"

У меня это не сработало в Linux. Печатает только букву, без острого.

MightyPork 29.05.2014 13:22

это работает только для текущей раскладки клавиатуры и для некоторых языков, у которых есть мертвая клавиша на клавиатуре

phuclv 16.01.2015 15:30
Ответ принят как подходящий

На основе кода 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 и соответственно нажимает / отпускает клавиши.

Нет, это решение полагается на метод только для Windows (AFAIK) с использованием Alt + Numpad для ввода символов Юникода.

Luke H 17.02.2014 01:25

@LukeH - для Mac, который я только что нашел - сначала перейдите в настройки международной системы -> меню ввода и установите флажок рядом с «Unicode hex». затем переключитесь на ввод Unicode в строке меню. Теперь, чтобы ввести символ Юникода, удерживайте опцию (alt) и введите шестнадцатеричное значение Юникода. Обсуждения Apple

Greg Domjan 08.08.2014 20:05

Для linux: при вводе символа все время удерживайте клавиши ctrl и shift. Удерживая их, нажмите «U», а затем четырехзначный восьмеричный код символа. pthree.org/2006/11/30/its-unicode-baby

Greg Domjan 08.08.2014 20:10

Помните, что AltCodes не поддерживают полный набор Unicode, а только символы в наборах символов IBM437 (ALT nnn) и Windows-1252 (ALT 0nnn) - см., Например, здесь. Можно включить полную поддержку юникода с помощью "ALT" "+" "nnnn" (см., Например, здесь). YMMV

vlp 29.10.2019 18:51

Лучший способ, который я нахожу при решении задачи 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 \

Спасибо, приятный аккуратный макет для работы с символами ascii, но не касается вопроса Unicode, который был основным.

Greg Domjan 21.06.2012 10:01

Другие вопросы по теме