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

avec Java Discussion :

Problème de clipboard


Sujet :

avec Java

Vue hybride

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

    Informations forums :
    Inscription : Mai 2009
    Messages : 51
    Par défaut Problème de clipboard
    Bonjour à tous

    Voilà, je développe une sorte de macro permettant de remplir automatiquement un formulaire HTML ouvert avec un navigateur WEB.

    Le principe est simple :

    Depuis le programme, on passe 3 paramètres à la fonction qui va effectuer le copier/coller. L'utilisateur doit cliquer dans le premier champ à remplir, le programme se chargeant ensuite d'effectuer le reste.

    J'ai deux problèmes :

    1 - je souhaiterai ne pas avoir à cliquer moi même dans le champ mais que le programme trouve tout seul la fenêtre de Firefox. Evidemment, ce serait faisable en utilisant les API de user32.dll si seulement mon programme n'était pas multiplateforme ... Bref, des amis programmeurs Java m'ont dit que c'était impossible mais on ne sait jamais ...

    2 - le premier problème n'est pas aussi grave que le second, pour lequel je vais vous montrer mon code :

    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
    34
    35
    36
    public static void CopierColler(String deux, String trois, String quatre) throws AWTException
      {
        Clipboard cp = Toolkit.getDefaultToolkit().getSystemClipboard();
     
        Robot robot = new Robot();
        robot.setAutoDelay(30);
        StringSelection stdeux = new StringSelection(deux);
        StringSelection sttrois = new StringSelection(trois);
        StringSelection stquatre = new StringSelection(quatre);
     
       	cp.setContents(stdeux, null);
        	robot.keyPress(KeyEvent.VK_CONTROL);
        	robot.keyPress(KeyEvent.VK_V);
        	robot.keyRelease(KeyEvent.VK_CONTROL);
        	robot.keyRelease(KeyEvent.VK_V);
        	robot.keyPress(KeyEvent.VK_TAB);
        	robot.keyRelease(KeyEvent.VK_TAB);
        	robot.keyPress(KeyEvent.VK_TAB);
        	robot.keyRelease(KeyEvent.VK_TAB);
        	robot.keyPress(KeyEvent.VK_TAB);
        	robot.keyRelease(KeyEvent.VK_TAB);
        	robot.keyPress(KeyEvent.VK_TAB);
        	robot.keyRelease(KeyEvent.VK_TAB);
        	cp.setContents(sttrois, null);
        	robot.keyPress(KeyEvent.VK_CONTROL);
        	robot.keyPress(KeyEvent.VK_V);
        	robot.keyRelease(KeyEvent.VK_CONTROL);
        	robot.keyRelease(KeyEvent.VK_V);
        	robot.keyPress(KeyEvent.VK_TAB);
        	robot.keyRelease(KeyEvent.VK_TAB);
        	cp.setContents(stquatre, null);
        	robot.keyPress(KeyEvent.VK_CONTROL);
        	robot.keyPress(KeyEvent.VK_V);
        	robot.keyRelease(KeyEvent.VK_V);
        	robot.keyRelease(KeyEvent.VK_CONTROL);
      }
    Comme vous le voyez, la macro copie la string deux dans le presse-papier système, la colle, passe au champ suivant, fait de même avec la string trois, passe au champ suivant puis fais de même avec la string quatre.

    Mon problème est le suivant : les string deux et quatre sont bien collées mais la string trois ne l'est pas. J'ai vérifié le contenu des variables, j'ai également vérifié que l'opération se faisait bien sur le bon champ mais c'est comme si le control+v était purement et simplement ignoré.

    Une idée ?

  2. #2
    Modérateur
    Avatar de dinobogan
    Homme Profil pro
    ingénieur
    Inscrit en
    Juin 2007
    Messages
    4 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : ingénieur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 4 073
    Par défaut
    Pourquoi passes-tu par un navigateur ?
    Tu pourrais coder directement la communication HTTP dans ton application. Utilise le HTTPClient de Jakarta.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java
    Que la force de la puissance soit avec le courage de ta sagesse.

  3. #3
    Membre expérimenté
    Avatar de (Benoit)
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    184
    Détails du profil
    Informations personnelles :
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Novembre 2008
    Messages : 184
    Par défaut
    Hello,
    Pour ton point 1, tu pourrais associer un raccourci clavier à ton champ de formulaire (tag accesskey) et ton application fait un keypress de ce raccourci clavier !
    Moche mais bon...

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    51
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 51
    Par défaut
    J'aurais du préciser que je n'ai aucun contrôle sur le code du formulaire HTML.

    C'est vraiment le point 2 qui m'ennuie.

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    51
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 51
    Par défaut
    Bon, j'avance un peu mais globalement, le problème reste le même.

    Je sais maintenant que les trois Strings sont bien copiées dans le presse-papier. Voici le code que j'ai utilisé :

    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
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
     
    public static void CopierColler(String une, String deux, String trois, String quatre) throws AWTException
      {
        char c = une.charAt(0);
        Clipboard cp = Toolkit.getDefaultToolkit().getSystemClipboard();
     
        Robot robot = new Robot();
        robot.setAutoDelay(30);
        System.out.println(deux);
        System.out.println(trois);
        System.out.println(quatre);
        StringSelection stdeux = new StringSelection(deux);
        StringSelection sttrois = new StringSelection(trois);
        StringSelection stquatre = new StringSelection(quatre);
     
        switch (c)
        {
        case 'A':
        	cp.setContents(stdeux, null);
        	robot.keyPress(KeyEvent.VK_CONTROL);
        	robot.keyPress(KeyEvent.VK_V);
        	robot.keyRelease(KeyEvent.VK_CONTROL);
        	robot.keyRelease(KeyEvent.VK_V);
        	break;
        case 'B':
            cp.setContents(stdeux, null);
            robot.keyPress(KeyEvent.VK_CONTROL);
            robot.keyPress(KeyEvent.VK_A);
            robot.keyRelease(KeyEvent.VK_CONTROL);
            robot.keyRelease(KeyEvent.VK_A);
            robot.keyPress(KeyEvent.VK_CONTROL);
            robot.keyPress(KeyEvent.VK_V);
            robot.keyRelease(KeyEvent.VK_CONTROL);
            robot.keyRelease(KeyEvent.VK_V);
            robot.keyPress(KeyEvent.VK_TAB);
            robot.keyRelease(KeyEvent.VK_TAB);
            robot.keyPress(KeyEvent.VK_TAB);
            robot.keyRelease(KeyEvent.VK_TAB);
            robot.keyPress(KeyEvent.VK_TAB);
            robot.keyRelease(KeyEvent.VK_TAB);
            robot.keyPress(KeyEvent.VK_TAB);
            robot.keyRelease(KeyEvent.VK_TAB);
            cp.setContents(sttrois, null);
            robot.keyPress(KeyEvent.VK_CONTROL);
            robot.keyPress(KeyEvent.VK_V);
            robot.keyRelease(KeyEvent.VK_CONTROL);
            robot.keyRelease(KeyEvent.VK_V);
            break;
        case 'C':
        	cp.setContents(stdeux, null);
        	System.out.println("2");
        	System.out.println(cp.getContents(cp));
        	robot.keyPress(KeyEvent.VK_CONTROL);
        	robot.keyPress(KeyEvent.VK_A);
        	robot.keyRelease(KeyEvent.VK_CONTROL);
        	robot.keyRelease(KeyEvent.VK_A);
        	robot.keyPress(KeyEvent.VK_CONTROL);
        	robot.keyPress(KeyEvent.VK_V);
        	robot.keyRelease(KeyEvent.VK_V);
        	robot.keyRelease(KeyEvent.VK_CONTROL);;
        	robot.keyPress(KeyEvent.VK_TAB);
        	robot.keyRelease(KeyEvent.VK_TAB);
        	robot.keyPress(KeyEvent.VK_TAB);
        	robot.keyRelease(KeyEvent.VK_TAB);
        	robot.keyPress(KeyEvent.VK_TAB);
        	robot.keyRelease(KeyEvent.VK_TAB);
        	robot.keyPress(KeyEvent.VK_TAB);
        	robot.keyRelease(KeyEvent.VK_TAB);
        	cp.setContents(sttrois, null);
        	System.out.println("3");
        	System.out.println(cp.getContents(cp));
        	robot.keyPress(KeyEvent.VK_CONTROL);
        	robot.keyPress(KeyEvent.VK_V);
        	robot.keyRelease(KeyEvent.VK_CONTROL);
        	robot.keyRelease(KeyEvent.VK_V);
        	robot.keyPress(KeyEvent.VK_TAB);
        	robot.keyRelease(KeyEvent.VK_TAB);
        	cp.setContents(stquatre, null);
        	System.out.println("4");
        	System.out.println(cp.getContents(cp));
        	robot.keyPress(KeyEvent.VK_CONTROL);
        	robot.keyPress(KeyEvent.VK_V);
        	robot.keyRelease(KeyEvent.VK_CONTROL);
        	robot.keyRelease(KeyEvent.VK_V);
        	break;
        }
      }
    Les cas A et B se déroulent sans problème.Seul le cas C pose problème.

    La sortie est bonne, j'obtiens quelque chose du genre :

    toto
    titi
    tata
    2
    sun.awt.datatransfer.TransferableProxy@4f0853
    3
    sun.awt.datatransfer.TransferableProxy@178655
    4
    sun.awt.datatransfer.TransferableProxy@746ad0
    La prochaine étape sera de voir ce qu'il y a dans les Transferable via les Dataflavor et tout le tralala.

    EDIT : Voilà, j'ai fais le test de sortie avec les DataFlavor :

    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
    34
    35
    36
    37
    38
    39
    40
    41
     
    case 'C':
        	cp.setContents(stdeux, null);
        	System.out.println("2");
        	String trstring = (String)(cp.getContents(null).getTransferData(DataFlavor.stringFlavor));
        	System.out.println(trstring);
        	robot.keyPress(KeyEvent.VK_CONTROL);
        	robot.keyPress(KeyEvent.VK_A);
        	robot.keyRelease(KeyEvent.VK_CONTROL);
        	robot.keyRelease(KeyEvent.VK_A);
        	robot.keyPress(KeyEvent.VK_CONTROL);
        	robot.keyPress(KeyEvent.VK_V);
        	robot.keyRelease(KeyEvent.VK_V);
        	robot.keyRelease(KeyEvent.VK_CONTROL);;
        	robot.keyPress(KeyEvent.VK_TAB);
        	robot.keyRelease(KeyEvent.VK_TAB);
        	robot.keyPress(KeyEvent.VK_TAB);
        	robot.keyRelease(KeyEvent.VK_TAB);
        	robot.keyPress(KeyEvent.VK_TAB);
        	robot.keyRelease(KeyEvent.VK_TAB);
        	robot.keyPress(KeyEvent.VK_TAB);
        	robot.keyRelease(KeyEvent.VK_TAB);
        	cp.setContents(sttrois, null);
        	System.out.println("3");
        	trstring = (String)(cp.getContents(null).getTransferData(DataFlavor.stringFlavor));
        	System.out.println(trstring);
        	robot.keyPress(KeyEvent.VK_CONTROL);
        	robot.keyPress(KeyEvent.VK_V);
        	robot.keyRelease(KeyEvent.VK_CONTROL);
        	robot.keyRelease(KeyEvent.VK_V);
        	robot.keyPress(KeyEvent.VK_TAB);
        	robot.keyRelease(KeyEvent.VK_TAB);
        	cp.setContents(stquatre, null);
        	System.out.println("4");
        	trstring = (String)(cp.getContents(null).getTransferData(DataFlavor.stringFlavor));
        	System.out.println(trstring);
        	robot.keyPress(KeyEvent.VK_CONTROL);
        	robot.keyPress(KeyEvent.VK_V);
        	robot.keyRelease(KeyEvent.VK_CONTROL);
        	robot.keyRelease(KeyEvent.VK_V);
        	break;
    Et évidemment, le contenu du presse-papier est bon, c'est donc bien le robot qui ne fait pas bien le boulot mais je ne m'explique pas pourquoi.

Discussions similaires

  1. Etrange probléme sur clipboard
    Par yann458 dans le forum Windows
    Réponses: 3
    Dernier message: 14/11/2013, 21h09
  2. Problème avec Clipboard.getData sous Windows 7
    Par TZRman dans le forum VB 6 et antérieur
    Réponses: 11
    Dernier message: 17/02/2012, 21h04
  3. Problème avec Clipboard.AsText
    Par JJJJJ dans le forum Débuter
    Réponses: 15
    Dernier message: 21/11/2011, 08h39
  4. [WIN32][D7] Petit problème clipboard
    Par hepha1970 dans le forum Débuter
    Réponses: 2
    Dernier message: 18/11/2007, 22h40
  5. Problème avec Clipboard
    Par Jean-Marc Dudemaine dans le forum Débuter
    Réponses: 3
    Dernier message: 10/11/2007, 00h17

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