Java détecter si un processus existe

L'auteur de ce sujet a trouvé une solution à son problème.
Auteur du sujet

Bonjour,

j'aurais besoin dans mon programme Java de détecter si un certain logiciel est lancé.
Y a t'il un moyen pas trop compliqué d'y parvenir ?

Car actuellement tout ce que j'ai trouvé c'est de passer par un script batch avec des ProcessBuilder, mais c'est un peu une usine à Gaz pour pas grand chose.

En vous remerciant, WinXaito.

+0 -0

Cette réponse a aidé l'auteur du sujet

A ma connaissance, il n'y a pas d'API de base en Java pour consulter la liste des processus actifs sur le système.

Que souhaites-tu faire avec cet autre logiciel ? Est-ce que tu veux vraiment juste savoir s'il est lancé ou non, ou bien comptes-tu communiquer avec ?

Si ton but est au final de communiquer avec, il vaudrait mieux te pencher sur des techniques classiques d'IPC (Interprocess communication). Suivant le système et ce que tu veux faire, il y a plusieurs gandes familles de solutions qui vont dans ce sens :

  • Communication via TCP/IP ou UDP/IP avec des sockets
  • Communication via des pipes nommées ou anonymes (je n'ai jamais utilisé de pipes nommées en Java mais ça doit sûrement pouvoir se faire, ça existe autant sous UNIX que sous windows)
  • Sous windows, Microsoft Component Object Model (COM) (Voir la bibliothèque COM4J)
  • Sous windows toujours, SendMessage et WM_COPYDATA (obligé d'utiliser JNA pour y avoir accès)
  • Si c'est un logiciel tournant sur une autre JVM, Java propose RMI
  • Si c'est plus orienté hardware, il y a SNMP

Si c'est un logiciel dont tu contrôles le code, tu pourrais mettre en place l'une de ces solutions. Si c'est un logiciel propriétaire dont tu ne contrôles pas le code, peut-être qu'il met déjà une de ces solutions à ta disposition. Par exemple:

  • On peut communiquer avec les logiciels de la suite Microsoft Office, avec Internet Explorer, ou beaucoup d'autres logiciels windows en utilisant COM.
  • Quelques logiciels proposent une interface de contrôle web et donc on peut s'y connecter avec des sockets TCP et quelques bases de protocole HTTP, ou des services web SOAP, XMLRPC, CORBA… Java a tout ce qu'il faut en natif pour le faire sans trop de difficulté normalement.
  • Il fut un temps ou il était possible de communiquer avec skype par socket sous UNIX et par WM_COPYDATA sous windows.
  • etc.

Si tu ne souhaites pas entrer en communication avec le logiciel mais, rééellement, uniquement savoir s'il est lancé ou non, alors là, effectivement, tu n'as pas trop le choix :

  • Soit tu es sous UNIX et tu appelles le programme ps, avec ProcessBuilder typiquement, probablement plus simple que de fouiller dans les tréfonds du kernel (mais avec JNA tu pourrais aussi faire des appels système si tu veux t'amuser)
  • Soit tu es sous windows et tu appelles les fonctions de l'API windows en utilisant une interface FFI comme JNA. Voir les functions EnumProcesses, OpenProcess et GetProcessImageFileName pour récupérer une liste de processus actuellement lancés et leurs noms.

Ma plateforme avec 23 jeux de société classiques en 6 langues et 13000 joueurs: http://qcsalon.net/ | Apprenez à faire des sites web accessibles http://www.openweb.eu.org/

+1 -0
Auteur du sujet

Merci de ta réponse,

en fait pour compléter ma question, j'aimerais fermer un logiciel s'il est lancé. (Afin d'y installer un Add-In).

Finalement, je pense que (Comme c'est uniquement sur windows), je lancerai le script d'office et si le programme est ouvert, je le ferme. (A ce propos, une possibilité de faire des boîte de dialog un peu comme les "MsgBox" en VBA en batch ?)

Mais merci tout de même de ta réponse complète, ça peut toujours être utile.

+0 -0

Cette réponse a aidé l'auteur du sujet

Pour fermer un logiciel, il y a toujours la méthode brute: pour les linuxiens c'est kill -9, sous windows ça s'appelle taskkill.

Sinon pour Office, on peut faire du VBA par l'intermédiaire de COM, et dans le VBA il y a sûrement une commande pour faire quitter Word/excel proprement en demandant si l'utilisateur veut sauvegarder les fichiers ouverts etc. JE ne me souviens plus, ça fait très longtemps que je n'ai pas fait de VBA…

MessageBox en batch, non, pas directement. Mais en Java tu peux certainement utiliser JNA pour avoir accès à la fonction MessageBox de l'API windows dans user32.dll, si tu ne veux pas t'encombrer de Swing/SWT/QT/etc. pour une simple boîte de dialogue.

Ma plateforme avec 23 jeux de société classiques en 6 langues et 13000 joueurs: http://qcsalon.net/ | Apprenez à faire des sites web accessibles http://www.openweb.eu.org/

+0 -0
Vous devez être connecté pour pouvoir poster un message.
Connexion

Pas encore inscrit ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte