IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

AWT/Swing Java Discussion :

simuler une touche


Sujet :

AWT/Swing Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 33
    Par défaut simuler une touche
    Bonjour,

    Je refait un topic pour que le problème que j'ai évoqué sur ce post :
    http://www.developpez.net/forums/sho...d.php?t=171477

    Je vais rerésumer ce que je cherche a faire : j'ai un JPasswordField et je cherche à brouiller un éventuel keylogger présent sur le système. L'idée était d'utiliser un Robot qui simule l'appui de touche et le programme se charge de faire la différence entre la saisie réel de l'utilisateur et celui du Robot. Voici comment j'ai procédé : j'ai fait une classe qui s'occupe de simuler l'appui des touches (un thread). Lorsque je simule, j'indique au thread principal la touche que j'ai simulé. Dans ce thread principal, j'ai ajouté un DocumentListener à mon JPasswordField pour détecter l'ajout de caractères. Le problème est que lorsque ma méthode insertUpdate est appelée, le caractère n'est pas encore dans le JPasswordField, alors je ne peux rien faire :/
    Voila maintenant je vous solicite à nouveau pour trouver une solution a ce problème ou trouver une autre idée pour arriver a mes fins.
    Merci

  2. #2
    Membre Expert
    Avatar de xavlours
    Inscrit en
    Février 2004
    Messages
    1 832
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 1 832
    Par défaut
    Bonjour,

    Je ne suis pas fort en composants textes, alors je vais forcément te proposer une solution différente : agir directement au niveau des KeyListeners. Tu crées une classe qui fait office de proxy pour les KeyEvents. Elle retire tous les keyListeners du composant, et les mémorise elle même. Comme ça, le composant de texte n'a qu'un seul KeyListener (cette classe précise) qui peut choisir si il faut ou non redispatcher le KeyEvent sur les listeners originaux du composant.

    J'ai été clair ?
    "Le bon ni le mauvais ne me feraient de peine si si si je savais que j'en aurais l'étrenne." B.V.
    Non au langage SMS ! Je ne répondrai pas aux questions techniques par MP.
    Eclipse : News, FAQ, Cours, Livres, Blogs.Et moi.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 33
    Par défaut
    Oui je crois avoir compris la théorie. Maintenant au niveau du code, c'est une autre affaire. Si j'ai bien compris, on récupère les KeyListener avec getKeyListeners() et on les retire avec removeKeyListener(). J'ajoute ensuite un KeyListener que j'aurai moi-même écrit. Il faut donc implémenter l'interface KeyListener. Maintenant, dans laquelle de ces 3 méthodes que je dois surcharger (keyTyped, keyPressed,keyReleased) je dois "autoriser" ou non les keyEvent ? et surtout, comment ?

  4. #4
    Membre Expert
    Avatar de xavlours
    Inscrit en
    Février 2004
    Messages
    1 832
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 1 832
    Par défaut
    Ben c'est à tester, et si quelqu'un d'autre pouvait confirmer, ça me rassurerait.

    En gros, ton propre KeyListener dispose d'une méthode permettant de savoir si le KeyEvent provient du robot ou de l'utilisateur. On va l'appeler checkEvent. Ensuite, pour chaque évènement (donc dans les 3 méthodes), ton KeyListener vérifie avec checkEvent si l'évènement doit être forwardé, et appelle la même méthode sur les autres listeners avec le même évènement.

    Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    public class ProxyListener implements KeyListener {
     
      private KeyListener[] otherListeners;
     
      public ProxyListener(JComponent comp) {
        otherListeners = comp.getListeners(KeyListener.class);
        for(int i = 0; i < otherListeners.length; i++)
          comp.removeListener(otherListeners[i]);
        comp.addKeyListener(this);
      }
     
      // returns true if the event is originated by the user
      public boolean checkEvent(KeyEvent e) {
        // a toi de jouer
      }
     
      public void keyPressed(KeyEvent e) {
        if(checkEvent(e))
        for(int i = 0; i < otherListeners.length; i++)
          otherListeners[i].keyPressed(e);
      }
     
      //idem pour KeyReleased et KeyTyped
    }
    Attention, c'est pas testé.
    "Le bon ni le mauvais ne me feraient de peine si si si je savais que j'en aurais l'étrenne." B.V.
    Non au langage SMS ! Je ne répondrai pas aux questions techniques par MP.
    Eclipse : News, FAQ, Cours, Livres, Blogs.Et moi.

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 33
    Par défaut
    Tout d'abord, merci pour tes réponses.
    Alors je viens de tester et le problème est que ce n'est pas les KeyListener qui gere l'ajout du texte dans le JPasswordField. Si on ajoute aucun KeyListener au composant de base, getKeyListeners() n'en retourne aucun. L'idée est pourtant bonne, mais je pense que ca serait + au niveau du gestionnaire des évènements qu'il faudrait faire le filtre. Par contre la, aucune idée comment faire cela :/

    EDIT: je met le code que j'ai utilisé pour testé au cas ou

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    public class ListenKey implements KeyListener{
        private KeyListener tKey[];
     
        public ListenKey(Component c){
            int i;
     
            tKey = c.getKeyListeners();
            for(i=0; i<tKey.length; i++)
                c.removeKeyListener(tKey[i]);
            c.addKeyListener(this);
        }
        public void keyPressed(KeyEvent e){
            int i;
     
            if( e.getKeyChar()!='a' )
                for(i=0; i<tKey.length; i++)
                    tKey[i].keyPressed(e);
        }
        public void keyReleased(KeyEvent e){
            int i;
     
            if( e.getKeyChar()!='a' )
                for(i=0; i<tKey.length; i++)
                    tKey[i].keyReleased(e);        
        }
        public void keyTyped(KeyEvent e){
            int i;
     
            if( e.getKeyChar()!='a' )
                for(i=0; i<tKey.length; i++)
                    tKey[i].keyTyped(e);        
        }
    }

  6. #6
    Membre Expert
    Avatar de xavlours
    Inscrit en
    Février 2004
    Messages
    1 832
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 1 832
    Par défaut
    Bon, j'ai fouillé un peu partout, et en fait, ce sont des DocumentEvents qui sont lancés lorsqu'on entre du texte. Apparemment, on ne peut pas avoir accès à tous les DocumentListeners d'un Document (pas de getter).

    A toi de voir, mais je pense que définir une classe Document que tu fournis à ton JPasswordField peut marcher. Cette classe surchargerait une méthode pertinente pour filtrer les ajouts de texte.

    Je vais continuer dessus par curiosité, mais je ne suis pas trop calé sur les composants texte.
    "Le bon ni le mauvais ne me feraient de peine si si si je savais que j'en aurais l'étrenne." B.V.
    Non au langage SMS ! Je ne répondrai pas aux questions techniques par MP.
    Eclipse : News, FAQ, Cours, Livres, Blogs.Et moi.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Simuler une touche clavier
    Par jblecanard dans le forum C++
    Réponses: 2
    Dernier message: 20/12/2010, 14h33
  2. Simuler une touche clavier
    Par SPACHFR dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 08/12/2010, 20h02
  3. Simuler une touche par une autre sous Windows
    Par sdelaunay dans le forum Windows
    Réponses: 2
    Dernier message: 05/05/2006, 14h31
  4. Simuler une touche clavier
    Par micky13 dans le forum Langage
    Réponses: 9
    Dernier message: 17/04/2006, 20h08
  5. [Applet]simuler une touche clavier
    Par mat10000 dans le forum Interfaces Graphiques en Java
    Réponses: 19
    Dernier message: 12/12/2003, 16h23

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo