简体   繁体   English

如何制作 Java.awt.Robot 类型的 unicode 字符? (是否可以?)

[英]How to make the Java.awt.Robot type unicode characters? (Is it possible?)

We have a user provided string that may contain unicode characters, and we want the robot to type that string.我们有一个用户提供的可能包含 unicode 字符的字符串,我们希望机器人输入该字符串。

How do you convert a string into keyCodes that the robot will use?如何将字符串转换为机器人将使用的 keyCode?
How do you do it so it is also java version independant (1.3 -> 1.6)?你是怎么做的,所以它也是java版本独立的(1.3 - > 1.6)?

What we have working for "ascii" chars is我们为“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);
  }
}

Based on javamonkey79's code I've created the following snippet which should work for all Unicode values...基于 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);
}

This automatically goes through each decade of the unicode key-code, maps it to the corresponding VK_NUMPAD equivalent and presses/releases the keys accordingly.这会自动遍历 unicode 键码的每个十年,将其映射到相应的 VK_NUMPAD 等效项,并相应地按下/释放键。

The KeyEvent Class does not have direct mappings for many unicode classes in JRE 1.5. KeyEvent 类没有直接映射 JRE 1.5 中的许多 unicode 类。 If you are running this on a Windows box what you may have to do is write a custom handler that does something like this:如果您在 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 );
}

eg Figure out what they key combinations are, and then map them to some sort of Object (maybe a HashMap?) for later lookup and execution.例如,弄清楚它们的键组合是什么,然后将它们映射到某种对象(可能是 HashMap?)以供以后查找和执行。

Hope this helps :)希望这可以帮助 :)

i think this is a bit late but...我觉得这有点晚了但是...

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

that just type an "á"只需输入“á”

Is this working , I tried the same in Laptop doesn't looks like helping me in typing unicode characters using java robot. 这是有效的,我在笔记本电脑中尝试相同,看起来不像是帮助我使用java机器人键入unicode字符。 any more light for same . 为此更多的光。

The best way that i find when solve simulare problem我在解决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 \\ http://www.devdaily.com/java/java-robot-class-example-mouse-keystroke \\

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM