2009-06-15 18 views
9

जावा कमांड लाइन एप्लिकेशन से कमांड प्रॉम्प्ट विंडो के शीर्षक को कैसे बदलें और अपडेट करें? हर बार जब मैं अपना एप्लिकेशन चलाता हूं, कमांड प्रॉम्प्ट विंडो शीर्षक दिखाता है: C:\WINDOWS\system32\cmd.exe - java MyAppकमांड लाइन जावा ऐप से कमांड प्रॉम्प्ट (कंसोल) विंडो शीर्षक कैसे बदलें?

जावा प्रोग्राम के रूप में विंडो शीर्षक को बदलना और अपडेट करना चाहते हैं, उदाहरण के लिए शीर्षक में स्थिति डाउनलोड करने के लिए wget (win32) अपडेट्स: Wget [12%]

उत्तर

20

हालांकि मैंने विंडोज़ में इसे स्वयं नहीं किया है, लेकिन कंसोल के शीर्षक को बदलने के लिए 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 है।

सूत्रों का कहना है:

+0

कृपया जेएनआई करने के सभी प्रयासों का खर्च न करें, https://jna.dev.java.net/ पर जाएं। जेएनआई की तुलना में जेएनए का उपयोग करना बहुत आसान है। पाइथन ctypes के बाद से यह सबसे अच्छी बात है। – paxdiablo

5

यह आपके टर्मिनल एमुलेटर पर निर्भर करता है, लेकिन अनिवार्य रूप से यह कंसोल पर नियंत्रण अनुक्रमों को प्रिंट कर रहा है।

अब मैं स्पष्ट नहीं हूं कि सीएमडी.एक्सईई किस नियंत्रण अनुक्रमों का जवाब देता है (मेरे पास यह कोशिश करने के लिए कोई उपलब्ध नहीं है) लेकिन मुझे लगता है कि 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

हाँ ... तेह आदेश शीर्षक "मेरे कूल शीर्षक" काम करता है –

+0

वह के रूप में कार्यक्रम चलाता है बदलने के लिए, बस नहीं जब से जावा अनुप्रयोग शुरू करने शीर्षक चाहता है कमांड लाइन इंटरफेस। – coobird

+0

हाँ मुझे पता है, इसलिए मैं किसी को सीएमडी में शीर्षक परिवर्तन के लिए भागने के अनुक्रम को ढूंढने के लिए कह रहा था (जो अस्तित्व में होना चाहिए लेकिन मुझे यह नहीं मिल रहा है, यहां तक ​​कि एएनएसआई.वाईएस में भी), या पूछताछ Java.lang.runtime का उपयोग कर सकता है जब आवश्यक हो तो शीर्षक कमांड को निष्पादित करने के लिए। अगर वह एक ही खिड़की पर काम करता है। – dlamblin

0

डैम्बलिन के प्रकाशन के बाद ;-) यहां एक पायथन कोड है। टिप्पणी सबसे प्रोग्रामिंग भाषाओं में 2 अलग आदेशों देखते हैं कि:

  • प्रणाली
  • कार्यकारी

प्रणाली एक ऐसी प्रणाली आदेश जारी करेगा, कार्यकारी वास्तव में एक नई प्रक्रिया spawns।इस प्रकार:

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

जो एक चल रहे प्रोग्राम के अंदर काम करता है। बस जावा समकक्ष खोजें।

+0

धन्यवाद, यह वही था जो मैं खोज रहा था। (Stackoverflow) प्रणाली काम करता है! – MDCore

+2

डाउनवॉटिंग क्योंकि यह जवाब देने के करीब भी नहीं आता है "मैं जावा शीर्षक *** में कैसे बदल सकता हूं ***?" –

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); 
    } 
} 
संबंधित मुद्दे