私は、文字列を入力するようにユーザーに求めている、遅れてこのメッセージを他の文書に戻すロボット(java.awt.Robot
)を使用しようとしています。 。私が今問題にしたのは、私が得たものをmessage.charAt(i)
からKeyEvent.VK_[insert Char]
KeyCodeに変換する必要があることです。私がやろうとしていることをする良い方法がありますか?私はいつもちょうど適切なKeyCodeを取得する大規模なswitch文を持つことができると思うが、私はよりエレガントな方法があることを望んでいた。しばらくの間、Pythonをやっていた私の最初の考えは、文字列を"KeyEvent.VK_" + message.charAt(i)
に変換してコードに変換することでしたが、これを行う唯一の方法はReflectionを使用することです。文字をJava KeyEventに変換するKeyCode
答えて
あなたはこれで何かを仕事ができる:それから、私はUnicode文字を持っていると私が望むすべてはそれのためのキーストロークを知っているのであれば
private void writeString(String s) {
for (int i = 0; i < s.length(); i++) {
char c = s.charAt(i);
if (Character.isUpperCase(c)) {
robot.keyPress(KeyEvent.VK_SHIFT);
}
robot.keyPress(Character.toUpperCase(c));
robot.keyRelease(Character.toUpperCase(c));
if (Character.isUpperCase(c)) {
robot.keyRelease(KeyEvent.VK_SHIFT);
}
}
robot.delay(delay);
}
:
KeyStroke ks = KeyStroke.getKeyStroke('k', 0);
System.out.println(ks.getKeyCode());
か、単にこれを使用します私は使用する
int keyCode = KeyEvent.getExtendedKeyCodeForChar(charCode);
私はこれを行うために別のより複雑な方法を必要としたことはありません。
私はその機能を持っていません。どのJavaのバージョンを使用していますか? – phreakhead
これはJava7ですが、これを使用してすべての可能な値を実行し、たとえば以前のバージョンで使用できるProperties MAPを簡単に作成できます。 –
@phreakheadでは、正しいKeyEventクラスをインポートするようにしてください。 'java.awt.event.KeyEvent'が必要です。私が最初にこのメソッドを試したとき、私のIDEはJavaでパッケージ化された別のものをピックアップしました! – Jason
反射を使用してください!
KeyEvent.class.getField("VK_"+keyName);
(int)KeyEvent.class.getField( "VK _" + keyName).getInt(null); –
より多くの冗長が、よりカスタマイズ
import java.awt.AWTException;
import java.awt.Robot;
import java.awt.event.KeyEvent;
import java.util.HashMap;
import java.util.Map;
public class AsciiKeyTyper {
private Map<Character,KeyStroke> strokeMap;
private Robot robot;
public AsciiKeyTyper() throws AWTException{
robot=new Robot();
//initialize a map from the input char to the keystroke,
//using the fact that sometimes the KeyEvent key codes correspond to ASCII
strokeMap=new HashMap<Character,KeyStroke>(){
private static final long serialVersionUID = 1L;{
put('\n',new KeyStroke(KeyEvent.VK_ENTER,false));
put('\t',new KeyStroke(KeyEvent.VK_TAB,false));
put('\r',new KeyStroke(KeyEvent.VK_HOME,false));
put(' ',new KeyStroke(KeyEvent.VK_SPACE,false));
put('!',new KeyStroke(KeyEvent.VK_1,true));
put('"',new KeyStroke(KeyEvent.VK_QUOTE,true));
put('#',new KeyStroke(KeyEvent.VK_3,true));
put('$',new KeyStroke(KeyEvent.VK_4,true));
put('%',new KeyStroke(KeyEvent.VK_5,true));
put('&',new KeyStroke(KeyEvent.VK_7,true));
put('\'',new KeyStroke(KeyEvent.VK_QUOTE,false));
put('(',new KeyStroke(KeyEvent.VK_9,true));
put(')',new KeyStroke(KeyEvent.VK_0,true));
put('*',new KeyStroke(KeyEvent.VK_8,true));
put('+',new KeyStroke(KeyEvent.VK_EQUALS,true));
put(',',new KeyStroke(KeyEvent.VK_COMMA,false));
put('-',new KeyStroke(KeyEvent.VK_MINUS,false));
put('.',new KeyStroke(KeyEvent.VK_PERIOD,false));
put('/',new KeyStroke(KeyEvent.VK_SLASH,false));
for(int i=(int)'0';i<=(int)'9';i++){
put((char)i,new KeyStroke(i,false));
}
put(':',new KeyStroke(KeyEvent.VK_SEMICOLON,true));
put(';',new KeyStroke(KeyEvent.VK_SEMICOLON,false));
put('<',new KeyStroke(KeyEvent.VK_COMMA,true));
put('=',new KeyStroke(KeyEvent.VK_EQUALS,false));
put('>',new KeyStroke(KeyEvent.VK_PERIOD,true));
put('?',new KeyStroke(KeyEvent.VK_SLASH,true));
put('@',new KeyStroke(KeyEvent.VK_2,true));
for(int i=(int)'A';i<=(int)'Z';i++){
put((char)i,new KeyStroke(i,true));
}
put('[',new KeyStroke(KeyEvent.VK_OPEN_BRACKET,false));
put('\\',new KeyStroke(KeyEvent.VK_BACK_SLASH,false));
put(']',new KeyStroke(KeyEvent.VK_CLOSE_BRACKET,false));
put('^',new KeyStroke(KeyEvent.VK_6,true));
put('_',new KeyStroke(KeyEvent.VK_MINUS,true));
put('`',new KeyStroke(KeyEvent.VK_BACK_QUOTE,false));
for(int i=(int)'A';i<=(int)'Z';i++){
put((char)(i+((int)'a'-(int)'A')),new KeyStroke(i,false));
}
put('{',new KeyStroke(KeyEvent.VK_OPEN_BRACKET,true));
put('|',new KeyStroke(KeyEvent.VK_BACK_SLASH,true));
put('}',new KeyStroke(KeyEvent.VK_CLOSE_BRACKET,true));
put('~',new KeyStroke(KeyEvent.VK_BACK_QUOTE,true));
}};
}
public void typeKey(char key){
try{
strokeMap.get(key).type();
}catch(NullPointerException ex){
System.err.println("'"+key+"': no such key in mappings");
}
}
private class KeyStroke{
int code;
boolean isShifted;
public KeyStroke(int keyCode,boolean shift){
code=keyCode;
isShifted=shift;
}
public void type(){
try{
if (isShifted) {
robot.keyPress(KeyEvent.VK_SHIFT);
}
robot.keyPress(code);
robot.keyRelease(code);
if (isShifted) {
robot.keyRelease(KeyEvent.VK_SHIFT);
}
if(code==KeyEvent.VK_ENTER){
robot.keyPress(KeyEvent.VK_HOME);
robot.keyRelease(KeyEvent.VK_HOME);
}
}catch(IllegalArgumentException ex){
String ch="";
for(char key:strokeMap.keySet()){
if(strokeMap.get(key)==this){
ch=""+key;
break;
}
}
System.err.println("Key Code Not Recognized: '"+ch+"'->"+code);
}
}
}
}
- 1. Android KeyEvent処理 - KeyCodeまたはGetUnicodeChar?
- 2. System.Windows.Forms.ShortcutをKeyData/KeyCodeに変換します
- 3. KeyTypedEvent KeyEventのKeyCodeは常に0ですか?
- 4. 文字列をJavaの文字列配列に変換する
- 5. Java:文字列を日付に変換
- 6. Java:タイムゾーン変数で日付を文字列に変換する
- 7. Javaで8文字の文字列をARGBカラーフォーマットに変換するには?
- 8. 文字列をJavaの文字列配列に変換するには?
- 9. 数字を文字に変換する
- 10. ベクトルをjavaの文字列に変換するには?
- 11. 文字列をJavaのDOMドキュメントオブジェクトに変換するには?
- 12. 'unsigned long'をJavaの文字列に変換するには
- 13. イメージをjavaのbase64文字列に変換するには?
- 14. 文字列をjava(複合文字列)の日付に変換する
- 15. 16進文字列をJavaのバイトに変換する
- 16. Javaの結果セットを文字列配列に変換する
- 17. Java:文字列をツリーに変換する
- 18. Javaで文字列を整数に変換する
- 19. バイトストリームをJavaの文字ストリームに変換する
- 20. javaの文字列をJsonに変換する方法
- 21. 文字列をDouble-Javaに変換する
- 22. JSON文字列をJavaのカスタムオブジェクトに変換する
- 23. java - 日付文字列をUTC時刻に変換する
- 24. HHMM文字列をJavaでGMT形式に変換する
- 25. 文字列をJavaのReaderに変換する方法
- 26. 文字列をarraylistに変換する<Character> in java
- 27. 文字列をJavaでdoubleに変換するときのNullpointerException
- 28. java(android)の文字列をIPアドレスに変換する
- 29. NSDataをplist形式でJavaの文字列に変換する
- 30. 文字列型をJavaのクラス型に変換する方法
ああ、これはそれがその後、単純にする必要があります。より大きな問題は、異なるキーボードレイアウトが、「拡張」キーストローク(「shift + ...」など)を含めるために必要なキーの組み合わせを変更することです。もう1つの問題は、 "A"と "a"が同じ仮想キーであることです。それらを互いに打ち消すのは、 "Shift"キーの追加です。あなたが直面する問題のいくつかのアイデアについては、[this](http://stackoverflow.com/questions/14572270/how-can-i-perfectly-simulate-keyevents/14615814#14615814)をご覧ください。 – MadProgrammer