Comment déterminez-vous si un personnage exige la touche Maj enfoncée pour être vers le bas pour être tapé?

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

  •  12-09-2019
  •  | 
  •  

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);
    }
}
Était-ce utile?

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
}

Si vous regardez le ces touches de symboles sont situés dans la gamme 0x21 - 0x2B
Vous pouvez probablement voir à la table ASCII pour reconnaître tous vos autres symboles.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top