2012-11-21 7 views
2

Java 로봇 클래스을 사용하여 debian lenny를 사용하여 vps 서버에서 키보드를 시뮬레이션하려고합니다. 내가이 명령을 사용하여 결과를보고하고있다 (vncviewer를 연결하기) :Linux의 Java 로봇 - 대문자 없음 (x11vnc 사용)

Xvfb :2 -screen 0 1366x768x16 & fluxbox & x11vnc -display :2 -bg -usepw -nomodtweak -xkb 

나는 소문자를 입력 할 수 있지만 대문자 작동하지 않습니다. 나는 인터넷 + 내 수정에서 다음 코드를 사용 :

import java.awt.AWTException; 
import java.awt.Robot; 
import java.awt.event.KeyEvent; 

public class TypingRobot extends Robot { 

public TypingRobot() throws AWTException { 
    super(); 
    // TODO Auto-generated constructor stub 
} 

public void keyType(int keyCode) { 
keyPress(keyCode); 
delay(50); 
keyRelease(keyCode); 
} 

public void keyType(int keyCode, int keyCodeModifier) { 

keyPress(keyCodeModifier); 
keyPress(keyCode); 
delay(50); 
keyRelease(keyCode); 
keyRelease(keyCodeModifier); 
} 


public void type(String text) { 
    //String textUpper = text.toUpperCase(); 
    String textUpper = text; 

    for (int i=0; i<text.length(); ++i) { 
    typeChar(textUpper.charAt(i)); 
    } 
} 

private void typeChar(char c) { 
    boolean shift = true; 
    int keyCode; 


    switch (c) { 
    case '~': 
    keyCode = (int)'`'; 
    break; 
    case '!': 
    keyCode = (int)'1'; 
    break; 
    case '@': 
    keyCode = (int)'2'; 
    break; 
    case '#': 
    keyCode = (int)'3'; 
    break; 
    case '$': 
    keyCode = (int)'4'; 
    break; 
    case '%': 
    keyCode = (int)'5'; 
    break; 
    case '^': 
    keyCode = (int)'6'; 
    break; 
    case '&': 
    keyCode = (int)'7'; 
    break; 
    case '*': 
    keyCode = (int)'8'; 
    break; 
    case '(': 
    keyCode = (int)'9'; 
    break; 
    case ')': 
    keyCode = (int)'0'; 
    break; 
    case ':': 
    keyCode = (int)';'; 
    break; 
    case '_': 
    keyCode = (int)'-'; 
    break; 
    case '+': 
    keyCode = (int)'='; 
    break; 
    case '|': 
    keyCode = (int)'\\'; 
    break; 
    case '?': 
    keyCode = (int)'/'; 
    break; 
    case '{': 
    keyCode = (int)'['; 
    break; 
    case '}': 
    keyCode = (int)']'; 
    break; 
    case '<': 
    keyCode = (int)','; 
    break; 
    case '>': 
    keyCode = (int)'.'; 
    break; 
    case '/': 
    keyCode = 47; 
    shift = false; 
    break; 
    case ' ': 
    keyCode = (int)' '; 
    shift = false; 
    break; 
    case '.': 
    keyCode = (int)'.'; 
    shift = false; 
    break; 
    default: 
    if((int)c>=65 && (int)c<=90){ 
     keyCode = (int)c; 
    } 
    else{ 
    keyCode = (int)c-32; 
    shift = false; 
    } 
    } 
    if (shift) 
    keyType(keyCode, KeyEvent.VK_SHIFT); 
    else 
    keyType(keyCode); 
} } 

내 입력은 다음과 같습니다

robot.type("Some string..."); 

하지만 작은 것들에 대문자를 변경합니다. 이 코드의 Windows 버전이 잘 작동하기 때문에 서버에 문제가 있다고 생각합니다. VNCviewer에서 Shift 키를 누르면 작동하지만 아마 Robot/x11vnc 또는 관련 항목이 나를 위해 누를 수 없습니다.

Shift 키를 사용하는 방법에 대한 아이디어가 있으십니까? (나는 또한 CAPSLOCK을 테스트했으나 아무런 변화도 없었습니다.)

+0

(http://gruimed.blogspot.ru/2009/09/using-java-robot-to-type-text-strings.html)의 의견 - 코드를 얻은 것으로 추정되는 곳에서 - keypresses 대신 Clipboard를 사용하는 마지막 주석입니다. - –

+1

@ KonstantinV.Salikhov - 응답 해 주셔서 감사합니다. 불행히도 이것도 작동하지 않았지만, 내 문제에 대한 해결책을 찾는데 도움이되었습니다. 주요 문제는 java 코드가 아니었지만 shift/ctrl/altt와 다른 문자를 좋아하지 않는 thix x11vnc 앱이었습니다. 대신 tightvncserver를 사용 했으므로 모든 것이 잘 작동합니다. – user1840547

답변

2

답변은 x11vnc, shift/ctrl/alt 키를 사용하지 마십시오. 대신 tightvncserver을 사용하십시오.