Comment déterminez-vous si un personnage exige la touche Maj enfoncée pour être vers le bas pour être tapé?
Question
Je suis en train d'écrire un code à taper les chaînes en utilisant la classe Robot. Tout est surtout bon (bien, je dois utiliser une instruction grand commutateur pour obtenir les codes d'activation de caractères), à l'exception des clés ne sont pas keycodes, parce qu'ils sont en fait une combinaison de Maj + une autre touche. Pour les lettres majuscules, il est facile de vérifier, à l'aide Character.isUpperCase(c)
, mais pour tous les symboles tels que !@#$%^&*()_+
et divers signes de ponctuation ne sont pas considérés « majuscules » bien qu'ils ne nécessitent changement d'être pressé afin de générer Thier pression de touche. J'ai essayé googler, mais juste trouvé un post sur le forum sans réponse satisfaisante. Est-il possible de déterminer si un caractère décalent des besoins à presser, et si oui, quel personnage est la version « non décalé »?
EDIT:. Voici le code que j'ai jusqu'à présent
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);
}
}
La solution
Je ne sais pas un moyen de résoudre votre problème directement (je viens fini par utiliser une carte pour les personnages), mais il pourrait vous donner quelques idées:
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();
}
}
}
Autres conseils
Je ne sais pas si ce que vous cherchez est possible. Vous pouvez créer votre propre table, mais gardez à l'esprit que ça va alors travailler pour une mise en page du clavier uniquement (de nombreuses langues ont leurs propres dispositions de clavier qui sont plus adaptés à leurs jeux de caractères spécifiques, aussi, il y a la disposition Dvorak qui a probablement est décalé vs clés sont propriétaires non transposées) à moins que vous prenez en compte toutes les dispositions de clavier que vous souhaitez soutenir et créer des tableaux personnalisés pour ceux-ci.
Pouvez-vous utiliser des classes AWT? Quelque chose comme cela pourrait fonctionner:
AWTKeyStroke ks = AWTKeyStroke.getAWTKeyStroke('!');
int modifers = ks.getModifiers();
if ((modifiers & KeyEvent.VK_SHIFT) == KeyEvent.VK_SHIFT) {
// Shift pressed
}