如何使Java.awt.Robot类型为unicode字符?(可能吗?)

如何使Java.awt.Robot类型为unicode字符?(可能吗?),java,unicode,automation,Java,Unicode,Automation,我们有一个用户提供的字符串,可能包含unicode字符,我们希望机器人键入该字符串 如何将字符串转换为机器人将使用的键码? 您是如何做到这一点的,这样它也是独立于java版本的(1.3->1.6) 我们为“ascii”字符工作的是 JRE 1.5中的许多unicode类没有直接映射。如果您在Windows机箱上运行此操作,您可能需要编写一个自定义处理程序,执行以下操作: Robot robot = new Robot(); char curChar = 'Ã'; // -- isUnicode

我们有一个用户提供的字符串,可能包含unicode字符,我们希望机器人键入该字符串

如何将字符串转换为机器人将使用的键码?
您是如何做到这一点的,这样它也是独立于java版本的(1.3->1.6)

我们为“ascii”字符工作的是

JRE 1.5中的许多unicode类没有直接映射。如果您在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 );
}
e、 找出它们的键组合是什么,然后将它们映射到某种对象(可能是HashMap?),以便以后查找和执行


希望这有帮助:)

我想这有点晚了,但是

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

只要根据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等价物,并相应地按下/释放键。

解决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){

    }
  }

}
import java.awt.AWTException;
导入java.awt.Robot;
公共类MyRobot{
公共静态void类型字符串(字符串s)
{
试一试{
Robot robik=新机器人();
byte[]bytes=s.getBytes();
for(字节b:字节)
{
int代码=b;
//keycode仅处理[A-Z](即ASCII十进制[65-90])
如果(代码>96&&code<123)代码=代码-32;
robik.延迟(40);
机器人按键(代码);
robik.钥匙释放(代码);
}
}捕获(awtexe){
}
}
}

\

Ouchie,我希望更简单一些,但这肯定会有帮助。我发现您不需要KeyEvent.VK\u数字符号。另外,数字需要像由numpad输入一样输入,即KeyEvent.VK_NUMPAD0。@Greg:我想你必须使用正确的配置才能正确输入。只是一个建议,但您也可以尝试将字符转换为int,然后转换为字符串,然后再转换为字符数组,这样您就可以解析每个字符了。。。只是一个想法。谢谢,处理ascii字符的布局很好,但是没有涵盖unicode这一要点。不,这个解决方案只依赖于Windows(AFAIK)使用Alt+Numpad输入unicode字符的方法。@LukeH-对于我刚找到的Mac-首先转到“国际系统首选项”->“输入”菜单,选中“unicode十六进制”旁边的框。然后在菜单栏中切换到unicode输入。现在,要输入unicode字符,请按住option(alt)并输入十六进制unicode值。对于linux-在输入字符时始终按住“ctrl”和“shift”。按住键的同时,按“U”,然后按字符的4位八进制代码。请注意,AltCodes不支持完整的unicode集,只支持IBM437(ALT-nnn)和Windows-1252(ALT-0nnn)字符集中的字符--请参见示例。可以通过“ALT”+“nnnn”启用完全的unicode支持(参见示例)。YMMV这在Linux上对我不起作用。它只键入字母,没有急促。这只适用于当前的键盘布局和某些键盘上有死键的语言。也许您可以将字符串放入剪贴板并发送Ctrl+V@Yaocl这当然是另一种获取信息的方式,它可以接受“粘贴”,有时是不可用的。另请参阅以获得一个好的解决方案
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){

    }
  }

}