2011-11-07 117 views
2

如何通过Java class将文本发送到计算机(如键盘)? 我已考虑使用Robot类按下并释放每个键,但这将是单调乏味的,并且无法从char获取KeyCodeJava模拟键盘

+0

你想文本发送到其他程序或您自己的程序? – Pace

+0

我的目标是发送文本到Word文档,谷歌搜索等。 – Confiqure

回答

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

谢谢,但并没有告诉我如何将char数组转换为int数组与相应的keyevents ... – Confiqure

+0

请参阅http:///java.sun.com/javame/reference/apis/jsr217/java/awt/event/KeyEvent.html。指定的KeyEvent.VK_J,...是int –

+0

那应该是什么?我想你只是告诉我,我需要以艰难的方式去做... – Confiqure

0

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

例如,一旦你有一个文本字段夹具(用于包装,可以让你控制组件的FEST项),你可以做

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

@ JavaCoder-1337不完全...

虽然有些switch-case(难道?)仍然需要处理一些(特殊)字符,大多数字符可以很容易地处理。

你需要多少取决于你目标受众,但无论情况下,可以通过组合处理:

  • AWTKeyStroke.getAWTKeyStroke(char yourChar).getKeyCode(); - 哪些 处理是最基本的; a-zA-Z被转换为they'r基 (a-z)的KeyEvents,和其他一些字符也类似地(base key only, no modifiers thus no casing is applied)处理。

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

  • Normalizer.normalize(String textToNormalize, Form.NFD); - 哪些分解最组成(重音)字符,如áàãâä,éèêë,íìîï,etc,和they'r大写当量,以they'r底座元件。示例:á (224)变为a (97),然后是´ [769]

如果您send(String text)方法能够发送口音,重音的简单swap(在本例中是VK_DEAD_ACUTE)和它的信,让他们得到适当的发送顺序,你会得到期望的á输出。从而消除了对过滤器的需求。

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

这些只是简化许多简化方法中的一小部分,可以缩短许多同行程序员所提出的(不明智的)方法的极其长的方法switch-case

例如,可以很容易地通过检测是否要被发送的字符处理壳体是大写的,然后检测当前的CapsLock状态反转套管操作中,如果需要的话:

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!\"");