2

我如何通过 a 将文本发送到计算机(如键盘)Java class?我考虑过使用Robot类来按下和释放每个键,但这会很乏味,而且没有办法KeyCodechar.

4

4 回答 4

1

尝试使用这个:

http://javaprogrammingforums.com/java-se-api-tutorials/59-how-sendkeys-application-java-using-robot-class.html

于 2011-11-07T12:51:44.900 回答
0

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

例如,一旦您有一个文本字段固定装置(允许您控制组件的包装器的 FEST 术语),您可以执行

JTextComponentFixture fixture =  ...;
fixture.enterText("Some text");
于 2011-11-07T13:08:32.400 回答
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);
}

另一种更简单的选择(我使用的那个)是简单地用(远)更适合这种操作的工具/语言编写宏(我使用并推荐AutoHotKey),然后简单地称之为从 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!\"");
于 2012-09-27T21:13:28.923 回答
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);
    }       
}
于 2013-02-18T17:04:41.720 回答