eva*_*daz 9 java windows command-line
如何从java命令行应用程序更改和更新命令提示符窗口的标题?每次运行我的应用程序时,命令提示符窗口标题显示:
C:\WINDOWS\system32\cmd.exe - java MyApp
.
我想在java程序运行时更改和更新窗口标题,例如wget(win32)更新标题中的下载状态:Wget [12%]
.
coo*_*ird 21
虽然我自己没有尝试过,但在Windows中,可以使用Win32 API调用SetConsoleTitle
来更改控制台的标题.
但是,由于这是对本机库的调用,因此需要使用类似Java Native Interface(JNI)的内容才能进行调用,这只适用于Windows 2000及更高版本.
编辑 - 使用JNI的解决方案
以下是使用JNI从Windows中的Java更改控制台窗口标题的示例.为了实现这一点,prerequiste是C中的一些知识并使用编译器/链接器.
首先,这是结果:
从Java应用程序更改控制台标题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);
}
}
}
Run Code Online (Sandbox Code Playgroud)
基本上,通过调用setTitle
外部本机库中的本机方法,每5秒更改一次标题ChangeTitle
.
编译完上述代码以生成ChangeTitle.class
文件后,该javah
命令用于创建在创建C库时使用的C头.
编写本机库
编写库将涉及针对生成的C头文件编写C源代码javah
.
所述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
Run Code Online (Sandbox Code Playgroud)
现在,实施,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);
};
Run Code Online (Sandbox Code Playgroud)
甲String
传递到本地函数改变为UTF-8编码的C字符串,其被发送到所述SetConsoleTitle
功能,其中,作为函数顾名思义,改变控制台的标题.
(注意:将字符串传递给SetConsoleTitle
函数可能存在一些问题,但根据文档,它也接受Unicode.我不太确定上面的代码在发送各种字符串时的效果如何. )
以上基本上是从第3.2节:访问Java本机接口程序员指南和规范的字符串以及MSDN 的SetConsoleTitle
功能页面获得的示例代码的组合.
有关错误检查的更复杂的示例代码,请参见第3.2节:访问字符串和SetConsoleTitle
函数页面.
构建DLL
事实证明,花费大量时间让我弄清楚的部分是将C文件编译成一个实际上可以在不引起错误的情况下读取的DLL UnsatisfiedLinkError
.
经过大量的搜索和尝试后,我能够将C源代码编译为可以从Java调用的DLL.由于我使用的是MinGW,我找到了一个页面表单mingw.org
,它描述了如何为JNI构建DLL.
资料来源:
这取决于您的终端仿真器,但实质上它只是将控制序列打印到控制台.
现在我不清楚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
Run Code Online (Sandbox Code Playgroud)
我个人只是用快捷方式捆绑整个东西,你可以编辑属性,如当前目录,命令,它的参数,窗口大小,样式和标题(如果我没记错的话).给它一个漂亮的图标,人们会使用它.