2011-11-07 6 views
2

Java class을 통해 키보드와 같은 컴퓨터로 텍스트를 보내려면 어떻게해야합니까? Robot 클래스를 사용하여 각 키를 눌렀다가 놓을 것을 고려해 왔지만 지루한 일이며 KeyCodechar에서 가져올 방법이 없습니다.Java 키보드 시뮬레이션

+0

다른 프로그램 또는 자신의 프로그램에 텍스트를 보내시겠습니까? – Pace

+0

내 목표는 단어 문서, 구글 검색 등등에 텍스트를 보내는 것입니다. – 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

에 한번 사용이 : (당신이 테스트를 위해 사용하지 않는 경우에도)

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

+0

고마워요,하지만 그게 각각의 keyevents와 int 배열로 문자 배열을 변환하는 방법을 말해주지 않습니다 ... – 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 기간) 텍스트 필드의 비품을 일단 예를 들어

, 당신은 ... - 1337 JavaCoder 정확 하 @

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

을 할 수

일부 (특수 문자)를 처리하려면 일부 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); - they'r 기본 요소로, 대부분의 구성 (악센트) 문자, áàãâä,éèêë,íìîï,etc처럼, 그리고 they'r 대문자 등가물을 분해한다. 예 : á (224)a (97)이고 다음에 ´ [769]이됩니다.

당신의 send(String text) 방법 (예에서이 VK_DEAD_ACUTE을의) 악센트의 간단한 swap, 악센트를 보낼 수 있으며, 그들이 적절한 전송 순서를 얻을 수 있도록 그것은, 편지, 그리고 당신이 원하는 á 출력을 얻을 경우 . 따라서 á 필터가 필요 없습니다.

첫 번째 단순화와 결합하면이 예에서는 3/3 [a,á,´] 대신 switch-case 대신 1/3 [´]이 필요합니다.

이들은 많은 동료 프로그래머가 (비 현명하게) 제안한 두려운 긴 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!\""); 
,
관련 문제