2010-03-08 21 views
0

Je suis confronté à un problème dans la mise en œuvre de la méthode de saisie pour clavier virtuel. Actuellement, j'utilise la classe robot pour envoyer des entrées à n'importe quelle application à partir du clavier virtuel. Mais pour cela, j'ai besoin de créer un mappage de code-clé et unicode, ce qui n'est pas cohérent sur une disposition de clavier différente, puis-je passer directement l'UNICODE à n'importe quelle application utilisant la méthode Input sans me soucier du mappage entre keycode et unicode.Méthode de saisie Java pour clavier virtuel

Un lien utile ou un exemple de code sera utile.

C'est un programme Java simple qui est toujours au-dessus de n'importe quelle application et fonctionne comme un clavier à l'écran. En utilisant une souris lorsque vous appuyez sur n'importe quel bouton (touche) du clavier, le caractère correspondant sera tapé dans l'application en cours d'exécution ci-dessous. Cela fonctionne parfaitement pour les alphabets anglais. Je suis confronté à un problème pendant que je fais pour Unicode.


trouver l'extrait de code ci-dessous

public static void simulateKeyEvent(char key){ 
    try{ 
      AWTKeyStroke awtKS = AWTKeyStroke.getAWTKeyStroke(key); 
      int key_code = awtKS.getKeyCode(); 
      System.out.println("key = "+key+" keyCode = "+key_code); 
      robot.keyPress(key_code); 
      robot.keyRelease(key_code); 

    }catch(Exception e){ 
      e.printStackTrace(); 
    } 
} 

Répondre

0

Votre clavier virtuel utilisé comme appareil par votre système d'exploitation? Ou, en d'autres termes, avez-vous essayé de le considérer comme un "vrai" clavier? Selon l'abstraction matérielle Java, si votre clavier virtuel devait être considéré comme un pilote, il devrait simplement fonctionner comme un vrai clavier.

EDIT: selon les commentaires, ce n'est pas un périphérique virtuel, mais une application Java, en conséquence, le problème est différent.

Selon Javadoc, Robot peut envoyer key strokes given as int. Pour créer ces touches à partir de caractères, je vous recommande de les créer en utilisant getKeystroke(char) avant de les transformer en valeurs entières en utilisant getKeycode(). De cette façon, vous auriez des valeurs entières associées à vos caractères Unicode, quels qu'ils soient.

EDIT 2: une fois de plus, une modification ;-)

il semble que getKeyStroke(String) "devrait" gérer les caractères unicode.

+0

Non, ce n'est pas un dispositif pour OS. C'est un programme Java simple qui est toujours au-dessus de toute application et fonctionne comme un clavier à l'écran. en utilisant une souris pendant que vous appuyez sur n'importe quel bouton (touche) du clavier, le caractère correspondant sera tapé dans l'application en cours d'exécution ci-dessous. Cela fonctionne parfaitement pour les alphabets anglais. Je suis confronté à un problème lors de l'utilisation que je fais pour unicode. – shekhar

+0

Pouvez-vous éditer votre question pour ajouter ces informations intéressantes? – Riduidel

+0

J'ai essayé ce que vous avez suggéré mais cela ne fonctionne pas pour le caractère UNICODE. Il renvoie toujours "0" comme code clé pour tout le caractère UNICODE – shekhar

1

Comment je sovled il:

//on startup: override the SystemEventQueue 
EventQueue eventQueue = Toolkit.getDefaultToolkit().getSystemEventQueue(); 
final OwnEventQueue newEventQueue = new OwnEventQueue(); 
eventQueue.push(newEventQueue); 
//because dispatchEvent is protected 
public class OwnEventQueue { 
    private final static OwnEventQueue instance; 

    static{ 
     instance = new OwnEventQueue(); 
    } 

    @Override 
    public void dispatchEvent(AWTEvent event) { 
     super.dispatchEvent(event); 
    } 

    public static OwnEventQueue getInstance() { 
     return instance; 
    } 
} 
//then onpress of keyboard button 
Character character = getCharacter(); 
int[] events = {KeyEvent.KEY_PRESSED, KeyEvent.KEY_RELEASED, KeyEvent.KEY_TYPED}; 
for (int i = 0; i < events.length; i++) { 
    KeyEvent pressKeyEvent = new KeyEvent(focusComponent, events[i], System.currentTimeMillis(), 0, 0, character.charValue()); 
    OwnEventQueue.getInstance().dispatchEvent(pressKeyEvent); 
} 
robotKeystrokeSender.keyPress(KeyEvent.VK_RIGHT); 
robotKeystrokeSender.delay(10); 
robotKeystrokeSender.keyRelease(KeyEvent.VK_RIGHT);