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

Java Discussion :

Process Runtime exec : envoyer une touche


Sujet :

Java

  1. #1
    Membre habitué
    Homme Profil pro
    Ingénieur étude et développement
    Inscrit en
    Février 2013
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur étude et développement
    Secteur : Finance

    Informations forums :
    Inscription : Février 2013
    Messages : 9
    Par défaut Process Runtime exec : envoyer une touche
    Bonjour à tous,

    malgré mes nombreuses recherches et tentatives, je n'arrive pas à trouver la solution.

    Je vous explique :

    dans le but d'automatiser des traitements, j'exécute une application externe avec la classe Process.
    Une fois le traitement de l'application effectué, un pop up apparaît pour indiquer que le traitement s'est bien déroulé, et il faut soit appuyer sur Entrée, soit cliquer sur ok afin de mettre un terme à l'application.
    Voici le bout de code qui effectue cela :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Process process = runtime.exec(new String[] {applicationProjectMerge, "-f" + emplacementFichierXMLMERGE , "-sp" + MDPIS, "-smp" + MDPMD});
    process.waitFot();
    Si je ne mets pas le waitFor, le traitement plante, car la suite de mon programme attend un fichier créé par l’application.
    Mais, tant que je n'ai pas appuyé sur Entrée ou cliqué sur ok, le waitFor n'est pas résolu.

    Il me faudrait donc un moyen d'envoyer une touche, ou simuler un clic afin de pouvoir poursuivre les traitements

    Je ne sais pas si j'ai été clair, mais est ce que quelqu'un pourrait m'aider ?

    Merci

  2. #2
    Membre Expert
    Inscrit en
    Mai 2006
    Messages
    1 364
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 1 364
    Par défaut
    Voila un petit tuto sur le lancement d'une commande shell :
    http://ydisanto.developpez.com/tutor.../runtime-exec/

    Dans ton cas, il: faut utiliser l'OutputStream et envoyer les caracteres qui vont bien au bon moment en utilisant l'inputstream/errorstream pour savoir quand envoyer

    PS : Si tu utilises Java 5 ou plus, il vaut mieux utiliser
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Process p = new ProcessBuilder(applicationProjectMerge, "-f" + emplacementFichierXMLMERGE , "-sp" + MDPIS, "-smp" + MDPMD).start();
    puis
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    OutputStream os = p.getOutputStream();

  3. #3
    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
    Il y a la classe java.awt.Robot pour simuler un événement clavier ou souris.
    Seulement ATTENTION : cette classe est à utiliser pour tests.
    Tu dois bien comprendre que c'est la fenêtre qui a le focus qui va recevoir l'événement clavier.
    Si un logiciel décide d'apparaitre et obtient le focus (au hasard une demande de mise à jour puis redémarrage automatique pour Windows), cela peut engendrer des problème...

    Tu devrais d'abord vérifier s'il y a possibilité de modifier le programme externe, ou alors de lui transmettre des paramètres pour ne pas avoir cette fenêtre. car la technique de clic automatique est très crado.
    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.

  4. #4
    Membre habitué
    Homme Profil pro
    Ingénieur étude et développement
    Inscrit en
    Février 2013
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur étude et développement
    Secteur : Finance

    Informations forums :
    Inscription : Février 2013
    Messages : 9
    Par défaut
    Bonjour et merci pour vos réponses

    j'ai modifié un peu mon code, je peux maintenant me passer du process;waitFor(), mais cela ne résout toujours pas mon problème.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     Process process = new ProcessBuilder(applicationProjectMerge, "-f" + emplacementFichierXMLMERGE , "-sp" + MDPIS, "-smp" + MDPMD).start();
                BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
                String line = "";
                OutputStream os = process.getOutputStream();
                PrintStream printStream = new PrintStream(process.getOutputStream());
                while((line = reader.readLine()) != null) {
                    System.out.println(line);
                    System.out.println(os.toString());
                    printStream.println();
     
                }
    j'essaie de lire la sortie du programme externe et de l'afficher dans la console mais rien ne s'affiche. Donc je ne peux pas savoir à quel moment envoyer la touche, d'où mon while ... dans lequel je souhaitais envoyer la touche entrée tant que le process existait...

    j'ai entendu parler de la classe PrintStream qui permet d'envoyer des caractère à une application externe, mais cela ne semble pas marcher...

    des idées ?

  5. #5
    Membre Expert
    Inscrit en
    Mai 2006
    Messages
    1 364
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 1 364
    Par défaut
    Citation Envoyé par Adampaige Voir le message
    j'essaie de lire la sortie du programme externe et de l'afficher dans la console mais rien ne s'affiche. Donc je ne peux pas savoir à quel moment envoyer la touche, d'où mon while ... dans lequel je souhaitais envoyer la touche entrée tant que le process existait...
    Je viens de relire ton post de départ et je n'avais pas fait attention que c'est une application windows. Elle n'existe pas en ligne de commande ? C'est plus simple a utiliser...

    Citation Envoyé par Adampaige Voir le message
    j'ai entendu parler de la classe PrintStream qui permet d'envoyer des caractère à une application externe, mais cela ne semble pas marcher...
    La classe printstream n'a rien à voir avec l'envoi de caracteres à une application externe. C'est simplement une classe qui facilite l'utilisation d'un outputstream.

  6. #6
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    Vérifie si le programme n'écrit pas plutôt dans la sortie d'erreur, que tu peux avoir avec getErrorStream()
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  7. #7
    Membre habitué
    Homme Profil pro
    Ingénieur étude et développement
    Inscrit en
    Février 2013
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur étude et développement
    Secteur : Finance

    Informations forums :
    Inscription : Février 2013
    Messages : 9
    Par défaut
    L'application existe en ligne de commande, et c'est pour cela que je la lance dans le runtime.
    Le but étant d'automatiser mes traitements, je ne peux donc pas la lancer en ligne de commande.

    j'ai essayé de récupérer le flux d'erreur, mais je n'ai rien trouvé dans ce flux.

    l'appli attend désespérément que je clique sur ok lorsque l'invite apparaît, ou que j'appuie sur Entrée.

    Sinon je pensais mettre un process.wait() le temps que l'application effectue les traitements (je mettrai 30mn pour être large) et ensuite un process.destroy() mais je n'arrive pas à l'implémenter car il y a toujours l'attente...

    auriez vous une idée pour sortir du process au bout d'un certain temps ?

  8. #8
    Membre habitué
    Homme Profil pro
    Ingénieur étude et développement
    Inscrit en
    Février 2013
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur étude et développement
    Secteur : Finance

    Informations forums :
    Inscription : Février 2013
    Messages : 9
    Par défaut
    Je viens de trouver la solution !

    j'ai pu ajouter un paramètre "-sup" afin de pouvoir réaliser les traitements en mode silencieux.
    Ce paramètre n'était pas spécifié dans la documentation de l'application mais dans une autre qui fait référence à une application tierce de celle que j'utilise.

    Merci à tous pour vos réponses.

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

Discussions similaires

  1. Envoyer une touche clavier vers une application tiers
    Par ProIsis dans le forum Général Dotnet
    Réponses: 4
    Dernier message: 29/11/2012, 18h57
  2. Envoyer une touche clavier sans focus sur fenetre
    Par linked dans le forum Shell et commandes GNU
    Réponses: 0
    Dernier message: 21/04/2009, 20h33
  3. [Runtime]exec d'une commande DOS
    Par fidififouille dans le forum API standards et tierces
    Réponses: 7
    Dernier message: 12/10/2005, 16h50
  4. [Process]probleme runtime.exec
    Par stanilas dans le forum API standards et tierces
    Réponses: 4
    Dernier message: 09/08/2005, 07h43
  5. [Runtime]exec() avec une commande paramétrée
    Par nice dans le forum Général Java
    Réponses: 9
    Dernier message: 12/05/2005, 13h15

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