Sto scrivendo un programma di base che chiede all'utente di digitare una stringa e sto cercando di utilizzare un robot (da java.awt.Robot
) che riporterà questo messaggio in un altro documento dopo un ritardo . Il problema che ho ora è che ho bisogno di convertire qualunque cosa ottenga da message.charAt(i)
a un KeyCode KeyEvent.VK_[insert Char]
. C'è un modo migliore per fare ciò che sto cercando di fare? Suppongo che potrei sempre avere un'enorme istruzione switch che ottiene il KeyCode appropriato ma speravo che ci fosse un modo più elegante. Il mio primo pensiero, avendo fatto python per un po 'di tempo, era di creare una stringa "KeyEvent.VK_" + message.charAt(i)
e convertirla in codice in qualche modo, ma penso che l'unico modo per farlo sia usare Reflection che è scoraggiato.Conversione di un Char in Java KeyEvent KeyCode
risposta
Si potrebbe lavorare su qualcosa con questo:
KeyStroke ks = KeyStroke.getKeyStroke('k', 0);
System.out.println(ks.getKeyCode());
o semplicemente utilizzare questo:
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);
}
Se ho un carattere Unicode e tutto quello che voglio è quello di conoscere la sequenza di tasti per esso, allora Io uso
int keyCode = KeyEvent.getExtendedKeyCodeForChar(charCode);
Non ho mai avuto bisogno di un altro, più complicato modo di farlo.
Non ho questa funzione. Su quale versione di Java sei? – phreakhead
È Java7 ... ma è possibile utilizzarlo facilmente per eseguire tutti i possibili valori e creare, ad esempio, una MAP proprietà che è possibile utilizzare nelle versioni precedenti. –
@phreakhead, assicurati di importare la classe KeyEvent corretta. Vuoi 'java.awt.event.KeyEvent'. Quando ho provato questo metodo per la prima volta, il mio IDE ne ha preso un altro con Java! – Jason
Utilizzare la riflessione!
KeyEvent.class.getField("VK_"+keyName);
(int) KeyEvent.class.getField ("VK _" + keyName) .getInt (null); –
Molto più prolisso, ma più personalizzabile
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. Conversione del flusso di int in char in java
- 2. Conversione QString in char *
- 3. Conversione di Unicodestring in Char []
- 4. Conversione di codice ASCII in char in Java
- 5. Conversione char [,] array a char **
- 6. C++ char * [] a char ** conversione
- 7. Conversione di un seg [char] per stringa
- 8. Caratteri KeyEvent
- 9. C++: char ** a const char ** conversione
- 10. Conversione di una NSString * in char?
- 11. Conversione di char * in float o double
- 12. Python - Conversione di esadecimale in INT/CHAR
- 13. Conversione di stringa esadecimale in char
- 14. Cython - conversione dell'elenco di stringhe in char **
- 15. Come arrivare keyCode in Android
- 16. Impossibile ascoltare KeyEvent in JavaFX
- 17. Conversione di un codice carattere in char (VB.NET)
- 18. Xkb: Come convertire un keycode in keysym
- 19. Char in byte? (Java)
- 20. Conversione da binario a char in C
- 21. Char a int conversione in C
- 22. char * conversione e aliasing regole
- 23. Conversione in Char/String da Ascii Int in Swift
- 24. Conversione ordine byte di rete con "char"
- 25. Conversione preferita da char (non char *) a std :: string
- 26. Conversione non valida da errore "const char *" a "char"
- 27. C++, la conversione non valida dal 'char' a 'const char *'
- 28. JNI Android - Conversione di char * in array di byte e ritorno a java
- 29. conversione non valida da 'const char *' a 'char *' [-fpermissive]
- 30. Conversione di stringhe nell'array "Character" in Java
Ah, questo dovrebbe essere più semplice, allora è. Il problema più grande che si avrà è che layout di tastiera diversi cambieranno quale combinazione di tasti è richiesta per includere i tratti chiave "estesi" (come 'shift + ...'). L'altro problema è che "A" e "a" sono la stessa chiave virtuale, ciò che li disginstush l'uno dall'altro è l'aggiunta della chiave 'Shift'. Dai un'occhiata a [questo] (http://stackoverflow.com/questions/14572270/how-can-i-perfectly-simulate-keyevents/14615814#14615814) per avere un'idea dei problemi che stai per affrontare. – MadProgrammer