2008-12-29 48 views
8

Tenemos una cadena proporcionada por el usuario que puede contener caracteres Unicode, y queremos que el robot escriba esa cadena.¿Cómo hacer que Java.awt.Robot escriba caracteres Unicode? (¿Es posible?)

¿Cómo se convierte una cadena en claveCódigos que utilizará el robot?
¿Cómo se hace así que también es una versión java independiente (1.3 -> 1.6)?

Lo que hemos trabajando para caracteres ASCII "es"

//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); 
    } 
} 
+0

Tal vez puedas poner una cadena en el portapapeles y enviar Ctrl + V – Yaocl

+0

@Yaocl. Esa es ciertamente otra forma de obtener información para algo que acepte un 'pegado', a veces eso no está disponible. –

+0

Ver también http://stackoverflow.com/a/14766664/34088 para una buena solución –

Respuesta

9

basado en el código de javamonkey79 he creado el siguiente fragmento que debería funcionar para todos los valores 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); 
} 

Esto pasa automáticamente a través de h cada década del código de clave Unicode, lo asigna al equivalente VK_NUMPAD correspondiente y presiona/libera las claves en consecuencia.

+0

Esto parece no funcionar en X (KDE aquí). –

+0

No, esta solución se basa en el método de solo Windows (AFAIK) de usar Alt + Numpad para ingresar caracteres Unicode. –

+0

@LukeH - para Mac Acabo de encontrar - Primero vaya a preferencias del sistema internacional-> ingrese el menú y marque la casilla junto a "Unicode hex". luego cambie a la entrada de Unicode en la barra de menú. ahora para ingresar un carácter Unicode, mantienes la opción (alt) e ingresa el valor hexadecimal Unicode. [Discusiones de Apple] (https://discussions.apple.com/thread/1899290?tstart=0) –

3

El KeyEvent Class no tiene asignaciones directas para muchas clases de Unicode en JRE 1.5. Si está ejecutando esta en una máquina Windows lo que es posible que tenga que hacer es escribir un controlador personalizado que hace algo como esto:

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

por ejemplo, Averigüe cuáles son las combinaciones de teclas y luego asúmelas a algún tipo de objeto (¿tal vez un HashMap?) Para una búsqueda y ejecución posterior.

Espero que esto ayude :)

+0

Ouchie, esperaba más simple, pero esto sin duda ayudará. –

+0

Descubrí que no necesita KeyEvent.VK_NUMBER_SIGN. También es necesario ingresar los números como si estuvieran en el teclado numérico, es decir. KeyEvent.VK_NUMPAD0. –

+0

Hackey bondad. Lo amo. –

0

creo que esto es un poco tarde, pero ...

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

que sólo tiene que escribir una "A"

+0

Esto no funcionó para mí en Linux. Escribe solo la letra, no aguda. – MightyPork

+0

que solo funciona para el diseño del teclado actual y para algunos idiomas que tienen deadkey en el teclado –

-1

La mejor manera que encuentro cuando se resuelve el problema 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

Gracias, buen diseño limpio para tratar con caracteres ASCII, pero no cubre el problema de unicode, que era el punto principal. –

0

Es este trabajo, he intentado lo mismo en portátil no parece ayudar a mí en escribir caracteres Unicode utilizando Java robot. más luz por lo mismo.

Cuestiones relacionadas