2009-06-15 371 views

回答

20

雖然我還沒有嘗試過自己,在Windows中,人們可以爲了改變控制檯的標題使用Win32 API調用SetConsoleTitle

但是,由於這是對本地庫的調用,因此需要使用類似於Java Native Interface (JNI)的內容才能進行調用,而且這僅適用於Windows 2000及更高版本。

編輯 - 使用JNI

下一個解決方案是爲了使用JNI來改變從Java在Windows控制檯窗口的標題的例子。爲了實現這一點,prerequiste在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); 
     } 
    } 
} 

基本上,標題每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 StringsSetConsoleTitle Function頁面。

構建DLL

發現竟然採取最大量的時間,我要弄清楚漸漸的C文件編譯成實際上可以在不引起UnsatisfiedLinkError讀取的DLL的一部分。

經過大量的搜索和嘗試之後,我能夠將C源代碼編譯成可以從Java調用的DLL。由於我使用MinGW,我發現一個頁面表格mingw.org其中described exactly how to build a DLL for JNI

來源:

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

是...德命令標題是「我的酷標題」工程 – 2009-06-15 02:20:16

+0

他希望將標題更改爲程序運行,而不是剛剛開始從Java應用程序時命令行界面。 – coobird 2009-06-15 02:25:40

+0

是的,我知道,所以我告訴某人在cmd中找到標題更改的轉義序列(它必須存在,但我無法在ANSI.SYS中找到它),或者提問者可以使用Java.lang.runtime在需要時執行標題命令。如果這在同一個窗口中工作。 – dlamblin 2009-06-15 02:34:44

0

dlamblin的啓示;-) 這裏是一個python代碼。 請注意,有在大多數編程語言2個不同的命令:

  • 系統
  • EXEC

,系統會發出系統命令,高管的確產生一個新的進程。因此:

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

它在正在運行的程序中工作。只需找到相應的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); 
    } 
} 
相關問題