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 Strings và SetConsoleTitle
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.org
mà described exactly how to build a DLL for JNI.
Nguồn:
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