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
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:
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:
- The Java Native Interface Programmer's Guide and Specification
- Chapter 2: Getting Started - Détails du processus en utilisant JNI.
- JNI-MinGW-DLL - Construction d'une DLL JNI sur MinGW avec gcc.
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.
oui ... Teh titre de commande « Mon titre Cool » fonctionne –
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
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
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.
Merci, c'était exactement ce que je cherchais. Le système (stackoverflow) fonctionne! – MDCore
Downvoting car cela ne se rapproche même pas de la réponse "comment changer le titre de la fenêtre *** EN JAVA ***?" –
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);
}
}
- 1. Comment modifier le titre de la fenêtre d'invite de commande
- 2. l'application Déconnecter java de la console/fenêtre de commande
- 3. compiler java à partir de la ligne de commande
- 4. Comment puis-je modifier le format d'une date à partir de la ligne de commande?
- 5. Sortie vers la ligne de commande si elle est démarrée à partir de la ligne de commande
- 6. Modifier le nom d'hôte Windows à partir de la ligne de commande
- 7. Résolution automatique Perforce à partir de la ligne de commande?
- 8. Modifier l'arrière-plan de Terminal.app à partir de la ligne de commande
- 9. SWT & JFace à partir de la ligne de commande
- 10. cvs checkout à partir de la ligne de commande Windows
- 11. Programme pour afficher une fenêtre de notification "toast" à partir de la ligne de commande Windows?
- 12. Publier sur RSS à partir de la ligne de commande
- 13. Publier ClickOnce à partir de la ligne de commande
- 14. Arguments de ligne de commande Java
- 15. Utilitaire de ligne de commande personnalisé. Comment?
- 16. Modifier les attributs de change-set à partir de la ligne de commande
- 17. Lancer des fichiers .jar avec des arguments de ligne de commande (mais sans fenêtre de console)
- 18. Transforme l'entrée de la ligne de commande en un tableau
- 19. Inetmgr (iis6) à partir de la boîte de dialogue d'exécution et de la ligne de commande
- 20. Transmission de paramètres de ligne de commande à VB6 IDE dans l'application console
- 21. Comment ouvrir le concepteur SharePoint à partir de la ligne de commande avec un site SharePoint
- 22. oracle ligne de commande de la question
- 23. Comment ajouter des en-têtes HTTP personnalisés à IIS à partir de la ligne de commande
- 24. ligne de commande d'entrée de tuyau en Java
- 25. Création d'un projet Java Eclipse à partir de la ligne de commande
- 26. Comment invoquer groovy avec 'java' depuis la ligne de commande
- 27. En utilisant la ligne de commande bash, comment ajouter "import package.name. *;" à de nombreux fichiers Java?
- 28. Comment appelez-vous le préprocesseur Visual Studio à partir de la ligne de commande?
- 29. Programme de ligne de commande Windows tiers?
- 30. Commutateur GNOME Terminal Profile à partir de la ligne de commande
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