2009-07-09 7 views
3

Robot 클래스를 사용하여 문자열을 입력하는 코드를 작성했습니다. 실제로는 키 스위치가 없기 때문에 키 코드가없는 것을 제외하고는 대부분 문자가 큰 문자를 사용해야합니다. Shift + 다른 키가 있습니다. 대문자의 경우, Character.isUpperCase(c)을 사용하여 확인하기가 쉽지만, [email protected]#$%^&*()_+과 같은 모든 기호와 다양한 구두점은 "대문자"로 간주되지 않습니다.하지만 대문자로 입력 할 때 Shift 키를 눌러야합니다. 인터넷 검색을 시도했지만 만족스런 답변이없는 포럼 게시물을 발견했습니다. 캐릭터가 이동해야하는지 여부를 결정할 수있는 방법이 있습니까? 그렇다면 "이동하지 않은"버전은 무엇입니까?캐릭터가 Shift 키를 눌러 내려야하는지 어떻게 결정합니까?

편집 : 여기까지 내가 지금까지 가지고있는 코드가 있습니다.

public void GenerateKeyTyped(char c) { 
    if (Character.isUpperCase(c)) { 
     r.keyPress(KeyEvent.VK_SHIFT); 
    } 
    r.keyPress(GetKeyCode(c)); 
    r.keyRelease(GetKeyCode(c)); 
    if (Character.isUpperCase(c)) { 
     r.keyRelease(KeyEvent.VK_SHIFT); 
    } 
} 
+0

일부 코드를 게시 할 수 있습니까 (아마도 엄청난 양의'switch' 문을 다듬은 후에)? 당신이하는 일을하기위한 더 좋은 방법은 아마도 엄청난 양의 코드를 필요로하지 않을 것입니다. Java는 키 코드를 ASCII 문자로 변환하는 방법을 알고 있습니다. 그것은 이미 당신이 원하는 것을 이미 할 수 있습니다. –

+0

여기 지금까지 가지고있는 코드가 있는데, 지금 당장은 내가 원하는 것을하지 않습니다. \t 공개 무효 GenerateKeyTyped (숯 c) { \t \t 경우 (Character.isUpperCase (c)) { \t \t \t r.keyPress (KeyEvent.VK_SHIFT는); \t \t} \t \t r.keyPress (GetKeyCode (c)); \t \t r.keyRelease (GetKeyCode (c)); \t \t if (Character.isUpperCase (c)) { \t \t \t r.keyRelease (KeyEvent.VK_SHIFT); \t \t r은 로봇이며 GetKeyCode (char c)는 ginormous switch 문입니다. 내가 실제로하려고하는 것은 파스칼로 작성된 키보드 컨트롤을위한 API를 구현하는 것이다. GetKeyCode는 API의 GetKeyCode 값을 직접 복사하기 만하면됩니다. –

+0

아, 형식이 잘못되어 원본 게시물에 추가했습니다. –

답변

1

나도 몰라 직접 (난 그냥 그 문자에 대한지도를 사용하여 종료) 문제를 해결하는 방법을하지만 몇 가지 아이디어 당신에게 줄 수 있습니다 : 이런 식으로 뭔가를 작동 할 수 있습니다

import java.io.*; 
import java.util.*; 
import java.awt.*; 
import java.awt.event.*; 
import javax.swing.*; 

public class Main3 { 

    public static void main(String[] args) { 
     try { 
      Robot robot = new Robot(); 

      HashMap<String, String> map = new HashMap<String, String>(); 
      map.put("!", "1"); 
      map.put("@", "2"); 
      map.put("#", "3"); 

      char[] charz = "abcdefgABCDEFG123!#".toCharArray(); 

      for(int i = 0; i < charz.length; i++) 
      { 
       System.out.print(charz[i] + " : "); 
       boolean shiftRequired = false; 
       String key = String.valueOf(charz[i]); 
       String value = map.get(key); 

       if (value != null) 
       { 
        shiftRequired = true; 
        key = value; 
       } 
       else if (Character.isUpperCase(key.charAt(0))) 
       { 
        shiftRequired = true; 
       } 
       else 
       { 
        key = key.toUpperCase(); 
       } 

       KeyStroke ks = KeyStroke.getKeyStroke("pressed " + key.toUpperCase()); 

       int keyCode = ks.getKeyCode(); 
       System.out.println(keyCode); 

       if (shiftRequired) 
        robot.keyPress(java.awt.event.KeyEvent.VK_SHIFT); 

       robot.keyPress(keyCode); 
       robot.keyRelease(keyCode); 

       if (shiftRequired) 
        robot.keyRelease(java.awt.event.KeyEvent.VK_SHIFT); 
      } 


     } catch(Exception e) { 
      e.printStackTrace(); 
     } 
    } 
} 
에게
+0

HashMap 대신 두 개의 배열을 사용하여 비슷한 작업을 수행했습니다. –

0

당신이 ASCII table 보면 이러한 기호 키 범위 0x21 - 0x2B
당신은 아마 다른 모든 문자 인식에 대한 ASCII 표에서 볼 수에 있습니다.

+0

예, 다른 switch 문을 사용할 수는 있지만 API가 있는지 궁금합니다. –

1

찾고있는 것이 가능한지 확실하지 않습니다. 자신 만의 테이블을 만들 수도 있지만, 하나의 키보드 레이아웃에서만 작동한다는 것을 명심하십시오. (많은 언어는 자신의 특정 문자 세트에 더 적합한 자체 키보드 레이아웃을 가지고 있습니다. 또한 Dvorak 레이아웃이 있습니다. 당신이 지원하고자하는 모든 키보드 레이아웃을 고려하지 않는 한 그것들에 대한 커스텀 테이블을 생성하지 않는다면,

+2

표준 Windows Dvorak 레이아웃에는 일반 QWERTY 키보드와 동일한 일련의 이동/변환되지 않은 문자가 있습니다. Dvorak에서 특정 캐릭터를 생성하려면 QWERTY로 이동해야하는 경우 이동이 필요합니다. –

+0

아, 잘 안다. 고마워! –

1

AWT 클래스를 사용할 수 있습니까?

AWTKeyStroke ks = AWTKeyStroke.getAWTKeyStroke('!'); 
int modifers = ks.getModifiers(); 

if ((modifiers & KeyEvent.VK_SHIFT) == KeyEvent.VK_SHIFT) { 
    // Shift pressed 
} 
+0

나는 그것을 시도하고, 불행히도 그것은 작동하지 않는 것 같습니다. 당신이 준 구체적인 예를 들면, & KeyEvent.VK_SHIFT 수식어는 외탄 마크가 0입니다. –