Saltar al contenido

¿Cómo cambiar el título de la ventana del símbolo del sistema (consola) desde la línea de comandos de la aplicación Java?

Hola, descubrimos la respuesta a lo que estabas buscando, desplázate y la hallarás aquí.

Solución:

Aunque no lo he probado yo mismo, en Windows, uno puede usar la llamada a la API de Win32 para SetConsoleTitle para cambiar el título de la consola.

Sin embargo, dado que se trata de una llamada a una biblioteca nativa, requerirá el uso de algo como Java Native Interface (JNI) para realizar la llamada, y esto solo funcionará en Windows 2000 y versiones posteriores.

Editar – Una solución usando JNI

El siguiente es un ejemplo del uso de JNI para cambiar el título de la ventana de la consola de Java en Windows. Para implementar esto, el requisito previo es algún conocimiento en C y usar el compilador/enlazador.

Primero, aquí está el resultado:

Cambiar el título de la consola desde una aplicación Java


(fuente: coobird.net)

Descargo de responsabilidad: esta es mi primera aplicación Java que usa JNI, por lo que probablemente no sea un buen ejemplo de cómo usarlo; no realizo ninguna verificación de errores y es posible que me falten algunos detalles.

El programa Java era el siguiente:

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);
        
    

Básicamente, el título se cambia cada 5 segundos llamando al setTitle método nativo en una biblioteca nativa externa llamada ChangeTitle.

Una vez compilado el código anterior para hacer un ChangeTitle.class archivo, el javah El comando se usa para crear un encabezado C que se usa al crear la biblioteca C.

Escribiendo la biblioteca nativa

Escribir la biblioteca implicará escribir el código fuente C contra el archivo de encabezado C generado por javah.

los ChangeTitle.h el encabezado era el siguiente:

/* DO NOT EDIT THIS FILE - it is machine generated */
#include 
/* 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

Ahora, la implementación, ChangeTitle.c:

#include 
#include 
#include 
#include 
#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);
;

A String que se pasa a la función nativa se cambia a un C codificado en UTF-8 stringque se envía a la SetConsoleTitle que, como sugiere el nombre de la función, cambia el título de la consola.

(Nota: puede haber algunos problemas con solo pasar el string en el SetConsoleTitle función, pero de acuerdo con la documentación, también acepta Unicode. No estoy muy seguro de qué tan bien funcionará el código anterior al enviar varias cadenas).

Lo anterior es básicamente una combinación de código de muestra obtenido de la Sección 3.2: Acceso a cadenas de la Guía y especificación del programador de la interfaz nativa de Java, y el SetConsoleTitle Página de funciones de MSDN.

Para obtener un código de muestra más complicado con verificación de errores, consulte la Sección 3.2: Acceder a cadenas y SetConsoleTitle Páginas de funciones.

Construyendo la DLL

La parte que resultó tomar la mayor cantidad de tiempo para mí fue hacer que los archivos C se compilaran en una DLL que en realidad podría leerse sin causar un UnsatisfiedLinkError.

Después de mucho buscar y probar cosas, pude compilar la fuente C en una DLL que se podía llamar desde Java. Como estoy usando MinGW, encontré un formulario de página mingw.org que describía exactamente cómo construir una DLL para JNI.

Fuentes:

  • La guía y especificación del programador de la interfaz nativa de Java
    • Capítulo 2: Primeros pasos: detalla el proceso con JNI.
  • JNI-MinGW-DLL: creación de una DLL de JNI en MinGW con gcc.

Esto depende de su emulador de terminal, pero esencialmente solo está imprimiendo secuencias de control en la consola.

Ahora no tengo claro a qué secuencias de control responde CMD.EXE (no tengo una disponible para probar esto), pero escuché que hay un comando llamado TÍTULO que establece el título de la ventana. Intenté canalizar la salida de TITLE a un archivo, pero aparentemente, en realidad no establece el título al generar caracteres de control. El comando INICIO puede tomar un parámetro que es el título de la ventana seguido del comando para ejecutar en la ventana. Entonces algo como

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

Personalmente, simplemente empaquetaría todo con un acceso directo donde puede editar las propiedades, como el directorio actual, el comando, sus parámetros y el tamaño, el estilo y el título de la ventana (si no recuerdo mal). Dale un buen ícono y la gente lo usará.

Aquí está mi solución usando 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);
    

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *