2010-09-02 5 views
2

J'ai un processus Java qui s'exécute sur un serveur Windows où je dois lancer un exe de ligne de commande. J'utiliseEst-il possible de capturer une boîte de message contextuelle Windows à l'intérieur d'un programme Java?

Process p = Runtime.getRuntime().exec(command); 
OutputStream stdin = p.getOutputStream(); 
InputStreamstderr = p.getErrorStream(); 
InputStream stdout = p.getInputStream(); 

pour exécuter le processus et capturer les flux d'entrée/sortie standard. Le problème que j'ai est l'un des exe que je dois lancer va lancer une boîte de message pop-up qui doit avoir cliqué sur "Ok" avant de finir l'échec.
Mon programme Java s'exécute en arrière-plan de sorte qu'il n'a pas de fenêtre dans laquelle afficher la boîte de message, ce qui signifie que le programme Java se bloque jusqu'à ce que quelqu'un le remarque et le tue dans le Gestionnaire des tâches.

Existe-t-il un moyen de pouvoir détecter ou détecter ces fenêtres pop-up depuis Java?

Répondre

1

Vous pourriez être chanceux. Vous pouvez utiliser JNA pour appeler EnumerateWindows ou FindWindow de l'API Win32. Puis recherchez le bouton via FindWindowEx.

Ensuite, « cliquez sur » en appelant PostMessage et l'envoi d'un BM_CLICK

Vous voulez sans doute avoir un fil de veilleur séparé qui fait tout cela, comme vous attend pour le processus programm pour mettre fin ou continuer.

Désolé ma réponse est très approximative. Le dîner a la priorité.

+0

Où c'est une approche à coup sûr, je penserais longtemps et dur avant de commencer cette route. À toutes fins utiles, l'application cesse d'être une application Java. – Cumbayah

+0

Vraiment vrai. Mais en même temps, la description de l'application semble ne jamais pouvoir être utilisée en dehors d'un environnement Windows. Aussi quand ce code spécifique à la plate-forme est bien encapsulé dans une classe séparée, je le considérerais comme une solution plutôt difficile mais aussi propre. Où Sunoracle n'a pas construit les ponts vers l'OS sous-jacent, vous devez le faire vous-même. – allesblinkt

+0

C'est une idée intéressante. L'application que j'ai est en fait un morceau d'un plus grand système qui doit fonctionner sur n'importe quel type d'OS.Ce problème surgit uniquement sur les serveurs Windows sur lesquels je dois exécuter une telle idée fonctionnerait encore et je pourrais l'ajouter en tant que couche sous l'appel d'exec(). – Sean

0

Non. C'est juste un processus en cours.

La création de tout ce qui met en place une interface graphique ou toute autre méthode de contrôle qui ne peut pas être contrôlée via stdin/out n'a pas de sens.

+0

Pourquoi diable at-il été rejeté? -.- – Cumbayah

+0

J'ai la même question. – CoolBeans

0

Non, pas directement pour autant que je sache. Cependant, vous pouvez probablement faire une certaine forme de notification asynchrone. Par exemple, vous pouvez afficher l'application particulière sur un sujet dans une file d'attente JSM à laquelle votre application peut s'abonner. Si vous n'avez pas la possibilité d'utiliser la route JMS, vous pouvez utiliser des déclencheurs basés sur la notification de fichier. Vous pouvez demander à l'autre application de créer un fichier fictif dans un répertoire commun et vous pouvez demander à votre application de surveiller ce répertoire.

En résumé, je ne pense pas que vous puissiez capturer un pop-up d'un autre processus à l'intérieur de votre processus. Vous devrez donc effectuer une forme de traitement externe/asynchrone pour le capturer.

+0

J'apprécierai si vous expliquez la raison derrière le vote vers le bas? Ce n'est pas très agréable de laisser un vote négatif sans une bonne explication! – CoolBeans

+0

La vérité indésirable, je suppose. ;/ – Cumbayah

0

Une solution inélégante, mais simple serait d'expirer.

Questions connexes