캐릭터가 타이핑하기 위해 변속 키를 다운 해야하는지 어떻게 결정합니까?

StackOverflow https://stackoverflow.com/questions/1101625

  •  12-09-2019
  •  | 
  •  

문제

로봇 클래스를 사용하여 문자열을 입력하기위한 코드를 작성하고 있습니다. 모든 키가 키코드가 없기 때문에 모든 키가 키코드가 없다는 점을 제외하고는 모든 것이 주로 훌륭합니다 (글쎄요 옮기다 + 다른 키. 대문자의 경우 쉽게 확인하고 사용하기 쉽습니다. Character.isUpperCase(c), 그러나 다음과 같은 모든 기호에 대해 !@#$%^&*()_+ 그리고 다양한 구두점은 "어퍼 케이스"로 간주되지는 않지만 키 스트로크를 생성하기 위해서는 교대를 눌러야합니다. 인터넷 검색을 시도했지만 만족스러운 답변이없는 포럼 게시물을 찾았습니다. 캐릭터가 누르기 위해 전환이 필요한지 여부를 결정할 수있는 방법이 있습니까? 그렇다면 "미확인"버전은 어떤 문자입니까?

편집 : 지금까지 내가 가지고있는 코드는 다음과 같습니다.

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);
    }
}
도움이 되었습니까?

해결책

나는 당신의 문제를 직접 해결할 수있는 방법을 모르지만 (나는 그 캐릭터에 대한지도를 사용하게되었습니다) 몇 가지 아이디어를 줄 수 있습니다.

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();
        }
    }
}

다른 팁

당신이 찾고있는 것이 가능하는지 확실하지 않습니다. 자신의 테이블을 만들 수는 있지만 하나의 키보드 레이아웃 만 작동한다는 점을 명심하십시오 (많은 언어에는 특정 문자 세트에 더 적합한 자체 키보드 레이아웃이 있으며 아마도 Dvorak 레이아웃도 있습니다. 지원하려는 모든 키보드 레이아웃을 고려하고 해당 사용자 정의 테이블을 작성하지 않는 한 자신의 이동 대 변속 대 키즈).

AWT 클래스를 사용할 수 있습니까? 이와 같은 것이 효과가있을 수 있습니다.

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

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

당신이 보면 ASCII 테이블 이 기호 키는 범위에 있습니다 0x21 - 0x2B
다른 모든 기호를 인식하기 위해 ASCII 테이블을 볼 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top