2011-11-07 170 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!\"");