캐릭터가 타이핑하기 위해 변속 키를 다운 해야하는지 어떻게 결정합니까?
문제
로봇 클래스를 사용하여 문자열을 입력하기위한 코드를 작성하고 있습니다. 모든 키가 키코드가 없기 때문에 모든 키가 키코드가 없다는 점을 제외하고는 모든 것이 주로 훌륭합니다 (글쎄요 옮기다 + 다른 키. 대문자의 경우 쉽게 확인하고 사용하기 쉽습니다. 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 테이블을 볼 수 있습니다.