2017-09-24 7 views
1

J'ai un programme de ligne de commande interactif, qui a une fonction d'achèvement de tabulation (complète la commande ou liste les options possibles) quand on appuie sur la touche de tabulation. J'écris un autre programme Java, qui lancera le programme de ligne de commande en tant que processus fils avec ProcessBuilder.API Java Process - envoi d'une touche de tabulation à un programme interactif

Je suis en mesure de transmettre l'entrée au processus en utilisant Process.getInputStream() et Process.getOutputStream().

Maintenant, je veux déclencher l'achèvement automatique dans le processus enfant. Lorsque j'imprime le caractère fiscal '\t', il est traité comme un caractère de tabulation normal, au lieu de déclencher l'achèvement automatique de l'onglet.

Existe-t-il un moyen d'envoyer une pression de touche ou un événement équivalent d'un processus Java à un processus enfant?

+0

Hey Jack, avez-vous donné un coup d'œil à ce https://stackoverflow.com/questions/3537706/how-to-unescape-a-java-string-literal-in-java –

+0

Cela semble différent. Dans ce cas, si j'écris le caractère '\ t' alors le processus fils lit le caractère d'une seule tabulation. Quand j'envoie "\\ t" (en fait deux caractères) le processus fils lit deux caractères. Mais ce que je veux, c'est envoyer l'événement de presse clé – JackDaniels

+0

Des fonctionnalités comme l'achèvement sont souvent désactivées lorsque le programme pense qu'il est utilisé de manière non interactive; pour bash (4.1) en particulier, readline n'est activé que si le shell est "démarré sans arguments sans option et sans l'option -c [et] l'entrée et l'erreur standard sont toutes deux connectées à des terminaux (comme déterminé par isatty (3)) , ou ... a démarré avec l'option -i ". Java 'ProcessBuilder' par défaut, et' Runtime.exec' utilise toujours des pipes pour stdin/out/err de l'enfant, et les pipes retournent false de isatty. Pour les autres coques ou programmes, consultez leur documentation. –

Répondre

0

Vous pouvez essayer d'utiliser un robot

Robot robot = new Robot(); 
robot.mouseMove(x, y); //Select the console window at x,y 
robot.keyPress(KeyEvent.VK_TAB); //Send tab key 

Ou encore en cours d'exécution OS commandes spécifiques, par exemple xdotool pour Unix en utilisant X11

xdotool windowactivate id && 
xdotool key Tab &&