2009-06-15 8 views
9

Comment modifier et mettre à jour le titre de la fenêtre d'invite de commande à partir de l'application de ligne de commande java? Chaque fois que je lance mon application, le titre de la fenêtre d'invite de commande s'affiche: C:\WINDOWS\system32\cmd.exe - java MyApp. Je voudrais changer et mettre à jour le titre de la fenêtre comme le programme java s'exécute, par exemple comme wget (win32) met à jour le statut de téléchargement dans le titre: Wget [12%].Comment modifier le titre de la fenêtre d'invite de commande (console) à partir de l'application Java en ligne de commande?

Répondre

20

Bien que je ne l'ai pas essayé moi-même, dans Windows, on peut utiliser l'appel API Win32 à SetConsoleTitle afin de changer le titre de la console.

Cependant, puisqu'il s'agit d'un appel à une bibliothèque native, il faudra utiliser quelque chose comme Java Native Interface (JNI) pour passer l'appel, et cela ne fonctionnera que sur Windows 2000 et les versions ultérieures.

Edition - Une solution en utilisant JNI

Ce qui suit est un exemple d'utilisation JNI afin de changer le titre de la fenêtre de la console de Java dans Windows. Pour implémenter cela, le prerequiste est une connaissance en C et en utilisant le compilateur/éditeur de liens.

D'abord, voici résultat:

Changing the console title from a Java application http://coobird.net/img/jni-change-console-title.png

Avertissement: Ceci est ma première application Java en utilisant JNI, donc il ne va probablement pas être un bon exemple de la façon de l'utiliser - je ne effectuer une vérification d'erreur du tout, et il se peut que je manque des détails.

Le programme Java a été la suivante:

class ChangeTitle { 

    private static native void setTitle(String s); 

    static { 
     System.loadLibrary("ChangeTitle"); 
    } 

    public static void main(String[] args) throws Exception { 

     for (int i = 0; i < 5; i++) { 
      String title = "Hello! " + i; 
      System.out.println("Setting title to: " + title); 
      setTitle(title); 
      Thread.sleep(1000); 
     } 
    } 
} 

Fondamentalement, le titre est changé toutes les 5 secondes en appelant la méthode native setTitle dans une bibliothèque native externe appelée ChangeTitle.

Une fois que le code ci-dessus a été compilé pour créer un fichier ChangeTitle.class, la commande javah est utilisée pour créer un en-tête C utilisé lors de la création de la bibliothèque C.

L'écriture de la bibliothèque native

L'écriture de la bibliothèque impliquera l'écriture du code source C par rapport au fichier d'en-tête C généré par javah.

L'en-tête ChangeTitle.h était la suivante:

/* DO NOT EDIT THIS FILE - it is machine generated */ 
#include <jni.h> 
/* Header for class ChangeTitle */ 

#ifndef _Included_ChangeTitle 
#define _Included_ChangeTitle 
#ifdef __cplusplus 
extern "C" { 
#endif 
/* 
* Class:  ChangeTitle 
* Method: setTitle 
* Signature: (Ljava/lang/String;)V 
*/ 
JNIEXPORT void JNICALL Java_ChangeTitle_setTitle 
    (JNIEnv *, jclass, jstring); 

#ifdef __cplusplus 
} 
#endif 
#endif 

Maintenant, la mise en œuvre, ChangeTitle.c:

#include <windows.h> 
#include <stdio.h> 
#include <conio.h> 
#include <jni.h> 
#include "ChangeTitle.h" 

JNIEXPORT void JNICALL 
Java_ChangeTitle_setTitle(JNIEnv* env, jclass c, jstring s) { 
    const jbyte *str; 
    str = (*env)->GetStringUTFChars(env, s, NULL); 

    SetConsoleTitle(str); 

    (*env)->ReleaseStringUTFChars(env, s, str); 
}; 

Un String qui est passé dans la fonction native est modifiée en un encodage UTF-8 C string, qui est envoyée au SetConsoleTitle function, qui, comme le suggère le nom de la fonction, change le titre de la console. (Note: Il peut y avoir quelques problèmes avec le passage de la chaîne dans la fonction SetConsoleTitle, mais selon la documentation, il accepte également Unicode. Je ne sais pas si le code ci-dessus fonctionnera correctement envoyer dans diverses chaînes.)

Ce qui précède est fondamentalement une combinaison d'un exemple de code obtenu à partir de Section 3.2: Accessing Strings de The Java Native Interface Programmer's Guide and Specification, et la page SetConsoleTitle Function de MSDN.

Pour un exemple de code plus complexe avec vérification d'erreur, veuillez consulter les pages Section 3.2: Accessing Strings et SetConsoleTitle Function.

la DLL

La partie qui se est avéré prendre le plus de temps pour moi de savoir était d'obtenir les fichiers C à compiler dans une DLL qui pourrait être lu en fait sans provoquer UnsatisfiedLinkError. Après beaucoup de recherches et d'essais, j'ai pu obtenir la source C à compiler vers une DLL qui pouvait être appelée depuis Java. Depuis que j'utilise MinGW, j'ai trouvé un formulaire de page mingw.org qui described exactly how to build a DLL for JNI.

Sources:

+0

S'il vous plaît ne pas dépenser autant d'efforts pour faire JNI, rendez-vous sur https://jna.dev.java.net/. C'est beaucoup plus facile d'utiliser JNA que JNI. C'est la meilleure chose depuis les ctypes de Python. – paxdiablo

5

Cela dépend de votre émulateur de terminal, mais il s'agit essentiellement d'imprimer des séquences de contrôle sur la console. Maintenant je ne sais pas sur quelles commandes contrôle CMD.EXE répond (je n'en ai pas un disponible pour essayer ceci) mais j'entends il ya une commande appelée TITLE qui définit le titre de la fenêtre. J'ai essayé d'afficher la sortie de TITLE dans un fichier, mais apparemment, il ne définit pas le titre en émettant des caractères de contrôle. La commande START peut prendre un paramètre qui est le titre de la fenêtre suivi de la commande à exécuter dans la fenêtre. Donc, quelque chose comme

cmd TITLE "lovely Application that is in a command window." && "java" MyApp 
REM or 
start "lovely Application that is java based." java MyApp 

Personnellement, je voudrais juste regrouper le tout avec un raccourci où vous pouvez modifier les propriétés telles que le répertoire courant, la commande, ses paramètres et la taille de la fenêtre, le style et le titre (si je rappelez-vous à juste titre). Donnez-lui une belle icône et les gens vont l'utiliser.

+0

oui ... Teh titre de commande « Mon titre Cool » fonctionne –

+0

Il veut le titre de changer le programme court, pas seulement lors du démarrage de l'application Java à partir du interface de ligne de commande. – coobird

+0

Ouais je sais, donc je disais à quelqu'un de trouver la séquence d'échappement pour le changement de titre dans cmd (qui doit exister mais je ne peux pas le trouver, même dans ANSI.SYS), ou le demandeur pourrait utiliser Java.lang.runtime Exécuter la commande de titre quand c'est nécessaire. Si cela fonctionne sur la même fenêtre. – dlamblin

0

suite à la révélation de dlamblin ;-) Voici un code python. note qu'il ya 2 différentes commandes dans la plupart des langages de programmation:

  • système
  • système exec

émettra une commande système, exec engendre en effet un nouveau processus.ainsi:

C:\>python 
>>> import os 
>>> os.system("title berry tsakala") 

qui fonctionne dans un programme en cours d'exécution. Il suffit de trouver l'équivalent java.

+0

Merci, c'était exactement ce que je cherchais. Le système (stackoverflow) fonctionne! – MDCore

+2

Downvoting car cela ne se rapproche même pas de la réponse "comment changer le titre de la fenêtre *** EN JAVA ***?" –

2

Voici ma solution à l'aide de la JNA:

import com.sun.jna.Library; 
import com.sun.jna.Native; 
import com.sun.jna.Platform; 

public class SetTitle { 

    public interface CLibrary extends Library { 
     CLibrary INSTANCE = (CLibrary) 
      Native.loadLibrary((Platform.isWindows() ? "kernel32" : "c"), 
           CLibrary.class); 

     boolean SetConsoleTitleA(String title); 
    } 

    public static void main(String[] args) { 
     CLibrary.INSTANCE.SetConsoleTitleA("Testing 123"); 
     System.exit(0); 
    } 
} 
Questions connexes