Java模拟键盘

时间:2011-11-07 12:40:00

标签: java string keyboard char awtrobot

如何通过Java class将文字发送到计算机(如键盘)? 我考虑使用Robot类来按下并释放每个键,但这样做会很乏味,而且无法从KeyCode获取char

4 个答案:

答案 0 :(得分:1)

答案 1 :(得分:0)

使用GUI测试框架(即使您不使用它进行测试)。我推荐FEST。在FEST中,您可以搜索GUI元素并自动执行各种用户交互,包括输入文本。

例如,一旦你有一个文本字段夹具(允许你控制组件的包装器的FEST术语),你可以做

JTextComponentFixture fixture =  ...;
fixture.enterText("Some text");

答案 2 :(得分:0)

@ JavaCoder-1337不完全......

虽然仍然需要一些switch-case (难道?)来处理某些(特殊)字符,但大部分字符都可以很容易地处理。

您需要多少取决于您的目标受众,但无论如何,您都可以通过以下方式处理它:

  • AWTKeyStroke.getAWTKeyStroke(char yourChar).getKeyCode(); - 哪个 处理最基本的; a-zA-Z被翻译成他们的基础 (a-z) keyEvents,其他一些字符的处理方式也类似 (base key only, no modifiers thus no casing is applied)

您可以想象,这种方法对于简化英语处理特别有效,因为与其他语言相比,该语言很少使用重音字母。

  • Normalizer.normalize(String textToNormalize, Form.NFD); - 它将大多数组合(重音)字符(如áàãâä,éèêë,íìîï,etc)和它们的大写等价物分解为它们的基本元素。示例:á (224)变为a (97),后跟´ [769]

如果您的send(String text)方法能够发送重音符号,重音符号的简单swap(在示例中为VK_DEAD_ACUTE)及其字母,以便他们获得正确的发送顺序,您将获得所需的á输出。因此,无需使用á过滤器。

结合第一次简化,对于此示例,需要1/3 [´]而不是3/3 [a,á,´] switch-case

这些只是为了缩短许多程序员(不明智地)建议的那种可怕的长switch-case方法而进行的许多简化中的一小部分。

例如,您可以通过检测要发送的字符是否为大写来轻松处理外壳,然后检测当前的封锁状态以反转外壳操作(如果需要):

boolean useShift = Character.isUpperCase(c);
useShift = Toolkit.getDefaultToolkit().getLockingKeyState(KeyEvent.VK_CAPS_LOCK) ? !useShift : useShift;
if (useShift) {
  keyPress(KeyEvent.VK_SHIFT);
  sendChar(aChar);
  keyRelease(KeyEvent.VK_SHIFT);
} else {
  sendChar(aChar);
}

另一个选项(我使用的那个),更简单,就是简单地用工具/语言编写一个宏(更适合这种操作)(我使用并推荐{{3} }),简单地从Java调用它的执行:

Runtime rt = Runtime.getRuntime();
//"Hello World!" is a command-line param, forwarded to the ahk script as it's text-to-send.
rt.exec(".../MyJavaBot/sendString.ahk \"Hello World!\"");

答案 3 :(得分:0)

不,还有一种柔和的方式(好吧,在Windows上它至少可以工作; - )):

private static void outputString(Robot robot,String str)
{
    Toolkit toolkit = Toolkit.getDefaultToolkit();
    boolean numlockOn = toolkit.getLockingKeyState(KeyEvent.VK_NUM_LOCK);

    int[] keyz=
    {
            KeyEvent.VK_NUMPAD0,
            KeyEvent.VK_NUMPAD1,
            KeyEvent.VK_NUMPAD2,
            KeyEvent.VK_NUMPAD3,
            KeyEvent.VK_NUMPAD4,
            KeyEvent.VK_NUMPAD5,
            KeyEvent.VK_NUMPAD6,
            KeyEvent.VK_NUMPAD7,
            KeyEvent.VK_NUMPAD8,
            KeyEvent.VK_NUMPAD9
    };

    if(!numlockOn)
    {
        robot.keyPress(KeyEvent.VK_NUM_LOCK);
    }

    for(int i=0;i<str.length();i++)
    {
        int ch=(int)str.charAt(i);
        String chStr=""+ch;
        if(ch <= 999)
        {
            chStr="0"+chStr;
        }           
        robot.keyPress(KeyEvent.VK_ALT);                    
        for(int c=0;c<chStr.length();c++)
        {               
            int iKey=(int)(chStr.charAt(c)-'0');
            robot.keyPress(keyz[iKey]);             
            robot.keyRelease(keyz[iKey]);               
        }
        robot.keyRelease(KeyEvent.VK_ALT);
    }       

    if(!numlockOn)
    {
        robot.keyPress(KeyEvent.VK_NUM_LOCK);
    }       
}