हालांकि मैंने विंडोज़ में इसे स्वयं नहीं किया है, लेकिन कंसोल के शीर्षक को बदलने के लिए Win32 API कॉल को SetConsoleTitle
पर उपयोग कर सकते हैं।
हालांकि, चूंकि यह मूल पुस्तकालय के लिए एक कॉल है, इसलिए कॉल करने के लिए इसे Java Native Interface (JNI) जैसे कुछ के उपयोग की आवश्यकता होगी, और यह केवल विंडोज 2000 और बाद में काम करेगा।
संपादित करें - JNI
निम्नलिखित का उपयोग कर एक समाधान के क्रम में JNI का उपयोग कर जावा से कंसोल विंडो Windows में की शीर्षक बदलने के लिए का एक उदाहरण है। इसे लागू करने के लिए, पूर्व शर्त सी में कुछ ज्ञान है और संकलक/लिंकर का उपयोग कर रहा है।
सबसे पहले, यहाँ परिणाम है:
Changing the console title from a Java application http://coobird.net/img/jni-change-console-title.png
अस्वीकरण: यह मेरा पहला जावा JNI का उपयोग कर अनुप्रयोग है, तो यह शायद नहीं है कि यह कैसे उपयोग करने के लिए एक अच्छा उदाहरण होने जा रहा है - मुझे नहीं पता कोई त्रुटि-जांच बिल्कुल करें, और मुझे कुछ विवरण याद आ रहे हैं।
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);
}
}
}
मूल रूप से, शीर्षक setTitle
देशी विधि ChangeTitle
कहा जाता है एक बाहरी देशी पुस्तकालय में फोन करके हर 5 सेकंड बदल गई है:
जावा कार्यक्रम निम्नलिखित था।
एक बार उपरोक्त कोड ChangeTitle.class
फ़ाइल बनाने के लिए संकलित किया गया है, तो javah
कमांड का उपयोग सी पुस्तकालय बनाने के दौरान किया जाने वाला सी हेडर बनाने के लिए किया जाता है।
देशी पुस्तकालय
पुस्तकालय लेखन सी हैडर 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
अब, क्रियान्वयन, 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
फ़ंक्शन में स्ट्रिंग में बस गुजरने के साथ कुछ समस्याएं हो सकती हैं, लेकिन दस्तावेज़ीकरण के अनुसार, यह यूनिकोड को भी स्वीकार करता है। मुझे यकीन नहीं है कि उपर्युक्त कोड कब काम करेगा विभिन्न तारों में भेजना।)
उपर्युक्त मूल रूप से The Java Native Interface Programmer's Guide and Specification से प्राप्त नमूना कोड का संयोजन है, और SetConsoleTitle
Function पृष्ठ एमएसडीएन से पृष्ठ है।
त्रुटि-जांच के साथ एक अधिक शामिल नमूना कोड के लिए, कृपया Section 3.2: Accessing Strings और SetConsoleTitle
Function पृष्ठों को देखें।
DLL
हिस्सा पता चला कि समय के सबसे अधिक राशि लेने के लिए मुझे यह पता लगाने के लिए एक DLL कि वास्तव में एक UnsatisfiedLinkError
पैदा करने के बिना पढ़ा जा सकता है में संकलित करने के लिए सी फ़ाइलें हो रही थी बिल्डिंग।
बहुत सारी खोज और चीजों को आजमाने के बाद, मैं सी स्रोत को एक डीएलएल को संकलित करने में सक्षम था जिसे जावा से बुलाया जा सकता था। चूंकि मैं मिनीजीडब्लू का उपयोग कर रहा हूं, मुझे एक पेज फॉर्म mingw.org
मिला जो described exactly how to build a DLL for JNI है।
सूत्रों का कहना है:
कृपया जेएनआई करने के सभी प्रयासों का खर्च न करें, https://jna.dev.java.net/ पर जाएं। जेएनआई की तुलना में जेएनए का उपयोग करना बहुत आसान है। पाइथन ctypes के बाद से यह सबसे अच्छी बात है। – paxdiablo