2009-06-15 21 views
9

javaコマンドラインアプリケーションからコマンドプロンプトウィンドウのタイトルを変更して更新するにはどうすればよいですか?アプリケーションを実行するたびに、コマンドプロンプトウィンドウのタイトルは C:\WINDOWS\system32\cmd.exe - java MyAppと表示されます。コマンドラインJavaアプリケーションからコマンドプロンプト(コンソール)ウィンドウタイトルを変更するにはどうすればいいですか?

たとえば、wget(win32)がタイトルのステータスをダウンロードして更新するなど、Javaプログラムの実行中にウィンドウタイトルを変更して更新したいとします。Wget [12%]

答えて

20

私は自分で試していませんが、Windowsでは、コンソールのタイトルを変更するためにWin32 APIコールをSetConsoleTitleにすることができます。

しかし、これはネイティブライブラリの呼び出しであるため、呼び出しを行うにはJava Native Interface (JNI)のようなものを使用する必要があります。これはWindows 2000以降でのみ有効です。

編集 - 次JNI

を使用してソリューションは、WindowsでのJavaのコンソールウィンドウのタイトルを変更するために、JNIを使​​用した例です。これを実装するために、事前準備は、Cとコンパイラ/リンカーの使用に関する知識です。

まず、ここでの結果です:

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

免責事項:これは、JNIを使​​用して私の最初のJavaアプリケーションですので、おそらく、それを使用する方法の良い例であることをつもりはない - 私はしないでくださいすべてのエラーチェックを実行し、私はいくつかの詳細が欠落している可能性があります。

Javaプログラムは、以下の通りであった:

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

基本的には、タイトルがChangeTitleと呼ばれる外部のネイティブライブラリでsetTitleネイティブメソッドを呼び出すことにより、5秒ごとに変更されます。

ChangeTitle.classファイルを作成するために上記のコードをコンパイルすると、javahコマンドを使用してCライブラリを作成するときに使用されるCヘッダーが作成されます。javahによって生成されるCヘッダ・ファイルに対してCのソースコードを書く伴いますライブラリを書くネイティブライブラリ

を書く

ChangeTitle.hヘッダは以下た:

/* 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 

次に、インプリメンテーション、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); 
}; 

ネイティブ関数に渡されるStringがUTF-8でエンコードされたCに変更されます文字列はSetConsoleTitle functionに送信されます。これは、関数名が示唆するように、コンソールのタイトルを変更します。

(注:SetConsoleTitle関数に文字列を渡すだけで問題はあるかもしれませんが、ドキュメントに従って、Unicodeも受け入れます。さまざまな文字列で送信します)。

上記は、基本的にMSDNのSection 3.2: Accessing Strings,The Java Native Interface Programmer's Guide and SpecificationおよびSetConsoleTitle Functionページのサンプルコードの組み合わせです。

エラーチェックを含むより複雑なサンプルコードについては、Section 3.2: Accessing StringsおよびSetConsoleTitle Functionページを参照してください。 DLL

私は実際にUnsatisfiedLinkErrorを発生させることなく読み取ることができるDLLにコンパイルするためにCのファイルを取得して把握するためにほとんどの時間を要することが判明一部を構築

検索や物事をしようと、多くの後、私は、Javaから呼び出すことができDLLにコンパイルするCソースを取得することができました。 MinGWを使用しているので、mingw.orgのページフォームdescribed exactly how to build a DLL for JNIが見つかりました。

出典:

+0

JNIをやっているすべての努力を費やさずに、https://jna.dev.java.net/に行きましょう。 JNIよりもJNAを使う方がずっと簡単です。これはPythonのctypes以来最高のものです。 – paxdiablo

5

これは端末エミュレータによって異なりますが、本質的には制御シーケンスをコンソールに出力するだけです。

CMD.EXEがどのような制御シーケンスに応答するのかはっきりしていませんが、私はこれを試してみることができませんでしたが、ウィンドウのタイトルを設定するTITLEというコマンドがあります。私はファイルにTITLEの出力をパイピングしようとしましたが、明らかに、制御文字を出力して実際にタイトルを設定するわけではありません。 STARTコマンドは、ウィンドウのタイトルであるパラメータを受け取り、ウィンドウ内でコマンドを実行することができます。私のであれば、何かが

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

のような個人的に私はちょうど、あなたは、現在のディレクトリなどのプロパティを編集することができますショートカットを使用してコマンドを全部をバンドルだろう、それはパラメータ、およびウィンドウサイズ、スタイルとタイトル(です覚えておいてください)。それに素敵なアイコンを付けて、人々がそれを使用します。

+0

はい... tehのコマンドタイトル「私のクールなタイトルは」からJavaアプリケーションを起動するとき、彼だけではなく、プログラムの実行時にタイトルを変更したい –

+0

の作品コマンドラインインタフェース。 – coobird

+0

ええ、私は知っているので、誰かにcmdのタイトル変更のためのエスケープシーケンスを見つけようとしていた(存在しなければならないがANSI.SYSでも見つからない)、またはaskerがJava.lang.runtimeそれが必要なときにタイトルコマンドを実行します。それは同じウィンドウで動作します。 – dlamblin

0

次のdlamblinの啓示;-) ここはPythonコードです。ほとんどのプログラミング言語での2つの異なるコマンドがあることを 注:

  • システム
  • execシステムコマンドを発行します

システムは、幹部は確かに新しいプロセスを生成します。したがって:実行中のプログラムの内部で動作する

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

ちょうどjava同等のものを見つける。

+0

ありがとう、これはまさに私が探していたものでした。 (stackoverflow)システムが動作します! – MDCore

+2

これは、「これはウィンドウタイトルを変更するにはどうすればよいですか?*** JAVA ***? –

2

ここ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); 
    } 
} 
関連する問題