如何從java命令行應用程序更改並更新命令提示符窗口的標題?每次運行我的應用程序時,命令提示符窗口標題顯示: C:\WINDOWS\system32\cmd.exe - java MyApp
。如何從命令行Java應用程序更改命令提示符(控制檯)窗口標題?
我想在java程序運行時更改和更新窗口標題,例如wget(win32)更新標題中的下載狀態:Wget [12%]
。
如何從java命令行應用程序更改並更新命令提示符窗口的標題?每次運行我的應用程序時,命令提示符窗口標題顯示: C:\WINDOWS\system32\cmd.exe - java MyApp
。如何從命令行Java應用程序更改命令提示符(控制檯)窗口標題?
我想在java程序運行時更改和更新窗口標題,例如wget(win32)更新標題中的下載狀態:Wget [12%]
。
雖然我還沒有嘗試過自己,在Windows中,人們可以爲了改變控制檯的標題使用Win32 API調用SetConsoleTitle
。
但是,由於這是對本地庫的調用,因此需要使用類似於Java Native Interface (JNI)的內容才能進行調用,而且這僅適用於Windows 2000及更高版本。
編輯 - 使用JNI
下一個解決方案是爲了使用JNI來改變從Java在Windows控制檯窗口的標題的例子。爲了實現這一點,prerequiste在C一些知識和使用的編譯器/連接器。
首先,這裏的結果:
免責聲明:這是使用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);
}
}
}
基本上,標題每5秒通過調用稱爲ChangeTitle
外部本地庫的setTitle
本地方法改變。
將上述代碼編譯爲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編碼Ç字符串,它被髮送到SetConsoleTitle
function,正如函數名稱所暗示的那樣,它將更改控制檯的標題。 (注意:將字符串傳入SetConsoleTitle
函數可能存在一些問題,但根據文檔,它也接受Unicode。我不太清楚上面的代碼在工作時如何工作發送各種字符串。)
上面基本上是從The Java Native Interface Programmer's Guide and SpecificationSection 3.2: Accessing Strings獲得樣本代碼,以及從所述MSDN頁面SetConsoleTitle
Function的組合。
欲瞭解更多涉及錯誤檢查的示例代碼,請參閱Section 3.2: Accessing Strings和SetConsoleTitle
Function頁面。
構建DLL
發現竟然採取最大量的時間,我要弄清楚漸漸的C文件編譯成實際上可以在不引起UnsatisfiedLinkError
讀取的DLL的一部分。
經過大量的搜索和嘗試之後,我能夠將C源代碼編譯成可以從Java調用的DLL。由於我使用MinGW,我發現一個頁面表格mingw.org
其中described exactly how to build a DLL for JNI。
來源:
這取決於您的終端仿真器,但實際上它只是將控制序列輸出到控制檯。
現在我不清楚什麼控制序列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
我個人只是捆綁了整個事情的快捷方式,你可以編輯的屬性,如當前目錄的命令,它的參數,和窗口大小,樣式和標題(如果我記得沒錯)。給它一個不錯的圖標,人們會使用它。
dlamblin的啓示;-) 這裏是一個python代碼。 請注意,有在大多數編程語言2個不同的命令:
,系統會發出系統命令,高管的確產生一個新的進程。因此:
C:\>python
>>> import os
>>> os.system("title berry tsakala")
它在正在運行的程序中工作。只需找到相應的Java。
下面是使用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);
}
}
是...德命令標題是「我的酷標題」工程 – 2009-06-15 02:20:16
他希望將標題更改爲程序運行,而不是剛剛開始從Java應用程序時命令行界面。 – coobird 2009-06-15 02:25:40
是的,我知道,所以我告訴某人在cmd中找到標題更改的轉義序列(它必須存在,但我無法在ANSI.SYS中找到它),或者提問者可以使用Java.lang.runtime在需要時執行標題命令。如果這在同一個窗口中工作。 – dlamblin 2009-06-15 02:34:44