2009-06-15 35 views
9

Làm thế nào để thay đổi và cập nhật tiêu đề của cửa sổ nhắc lệnh từ ứng dụng dòng lệnh java? Mỗi khi tôi chạy ứng dụng của mình, tiêu đề cửa sổ nhắc lệnh hiển thị: C:\WINDOWS\system32\cmd.exe - java MyApp.Làm thế nào để thay đổi tiêu đề cửa sổ lệnh (console) từ ứng dụng Java dòng lệnh?

Tôi muốn thay đổi và cập nhật tiêu đề cửa sổ khi chương trình java chạy, ví dụ như wget (win32) cập nhật trạng thái tải xuống trong tiêu đề: Wget [12%].

Trả lời

20

Mặc dù bản thân tôi chưa thử, trong Windows, người dùng có thể sử dụng lệnh gọi Win32 API tới SetConsoleTitle để thay đổi tiêu đề của bảng điều khiển. Tuy nhiên, vì đây là một cuộc gọi đến một thư viện gốc, nó sẽ yêu cầu sử dụng một cái gì đó như Java Native Interface (JNI) để thực hiện cuộc gọi, và điều này sẽ chỉ hoạt động trên Windows 2000 trở lên.

Edit - Một giải pháp sử dụng JNI

Sau đây là một ví dụ của việc sử dụng JNI để thay đổi tiêu đề của giao diện điều khiển cửa sổ từ Java trong Windows. Để thực hiện điều này, các prerequiste là một số kiến ​​thức trong C và sử dụng trình biên dịch/linker.

Thứ nhất, đây là kết quả:

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

Disclaimer: Đây là ứng dụng Java đầu tiên của tôi sử dụng JNI, vì vậy nó có lẽ sẽ không thể là một ví dụ tốt về làm thế nào để sử dụng nó - Tôi không thực hiện bất kỳ kiểm tra lỗi nào cả và tôi có thể thiếu một số chi tiết.

Chương trình Java là như sau:

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

Về cơ bản, tiêu đề được thay đổi mỗi 5 giây bằng cách gọi setTitle phương pháp có nguồn gốc trong một thư viện có nguồn gốc bên ngoài được gọi là ChangeTitle.

Khi mã trên được biên soạn để tạo tệp ChangeTitle.class, lệnh javah được sử dụng để tạo tiêu đề C được sử dụng khi tạo thư viện C.

Viết thư viện bản địa

Viết thư viện sẽ liên quan đến văn bản mã nguồn C chống lại các tập tin tiêu đề C tạo ra bởi javah.

Tiêu đề ChangeTitle.h là như sau:

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

Bây giờ, việc thực hiện, 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); 
}; 

Một String được chuyển vào chức năng có nguồn gốc được thay đổi thành một UTF-8 mã hóa C chuỗi, được gửi đến SetConsoleTitle function, trong đó, như tên hàm cho thấy, thay đổi tiêu đề của bảng điều khiển.

(Lưu ý: Có thể có một số vấn đề khi chỉ chuyển chuỗi vào hàm SetConsoleTitle, nhưng theo tài liệu, nó cũng chấp nhận Unicode. Tôi không chắc chắn mã trên sẽ hoạt động như thế nào gửi theo các chuỗi khác nhau.)

Ở trên về cơ bản là kết hợp mã mẫu lấy từ Section 3.2: Accessing Strings của The Java Native Interface Programmer's Guide and Specification và trang SetConsoleTitle Function từ MSDN.

Để có mã mẫu có liên quan hơn với kiểm tra lỗi, vui lòng xem các trang Section 3.2: Accessing StringsSetConsoleTitle Function.

Xây dựng DLL

Phần rằng hóa ra mất số tiền lớn thời gian cho tôi để tìm ra đã nhận được các tập tin C để biên dịch thành một DLL mà thực sự có thể được đọc mà không gây ra một UnsatisfiedLinkError.

Sau khi tìm kiếm và thử nhiều thứ, tôi có thể lấy nguồn C để biên dịch thành một DLL có thể được gọi từ Java. Vì tôi đang sử dụng MinGW, tôi đã tìm thấy một mẫu trang mingw.orgdescribed exactly how to build a DLL for JNI.

Nguồn:

+0

Xin đừng tốn tất cả nỗ lực đó khi thực hiện JNI, hãy truy cập https://jna.dev.java.net/. Việc sử dụng JNA dễ dàng hơn rất nhiều so với JNI. Đó là điều tốt nhất kể từ Python ctypes. – paxdiablo

5

Điều này phụ thuộc vào trình mô phỏng thiết bị đầu cuối của bạn, nhưng về cơ bản nó chỉ in ra các chuỗi điều khiển cho bảng điều khiển.

Bây giờ tôi không rõ ràng về chuỗi điều khiển CMD.EXE trả lời (tôi chưa có sẵn để thử tính năng này) nhưng tôi nghe có lệnh gọi là TITLE đặt tiêu đề của cửa sổ. Tôi đã cố gắng đưa đầu ra của TITLE vào một tệp, nhưng rõ ràng, nó không thực sự đặt tiêu đề bằng cách xuất các ký tự điều khiển. Lệnh START có thể lấy một tham số là tiêu đề của cửa sổ, theo sau là lệnh để chạy trong cửa sổ. Vì vậy, một cái gì đó giống như

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

Cá nhân tôi sẽ chỉ bó toàn bộ sự việc với một phím tắt mà bạn có thể chỉnh sửa các thuộc tính như thư mục hiện hành, lệnh, đó là thông số, và kích thước cửa sổ, phong cách và tiêu đề (nếu tôi nhớ đúng). Cung cấp cho nó một biểu tượng đẹp và mọi người sẽ sử dụng nó.

+0

vâng ... teh danh hiệu lệnh "My mát Title" làm việc –

+0

Ông muốn tiêu đề để thay đổi khi chương trình chạy, không chỉ khi khởi động ứng dụng Java từ giao diện dòng lệnh. – coobird

+0

Vâng tôi biết, vì vậy tôi đã nói với ai đó để tìm chuỗi thoát cho sự thay đổi tiêu đề trong cmd (mà phải tồn tại nhưng tôi không thể tìm thấy nó, ngay cả trong ANSI.SYS), hoặc người hỏi có thể sử dụng Java.lang.runtime để thực hiện lệnh tiêu đề khi cần. Nếu nó hoạt động trên cùng một cửa sổ. – dlamblin

0

sau khi tiết lộ của dlamblin ;-) đây là mã python. lưu ý rằng có 2 lệnh khác nhau trong hầu hết các ngôn ngữ lập trình:

  • hệ thống
  • exec

hệ thống sẽ phát hành một lệnh hệ thống, exec thực sự sinh ra một quá trình mới.do đó:

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

hoạt động bên trong chương trình đang chạy. Chỉ cần tìm java tương đương.

+0

Cảm ơn, đây chính xác là những gì tôi đang tìm kiếm. Hệ thống (stackoverflow) hoạt động! – MDCore

+2

Downvoting vì điều này thậm chí không đến gần để trả lời "làm cách nào để thay đổi tiêu đề cửa sổ *** IN JAVA ***?" –

2

Đây là giải pháp của tôi sử dụng 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); 
    } 
} 
Các vấn đề liên quan