2013-02-21 8 views
6

विम की तरह: जब यह शुरू होता है तो यह आपको दूसरे "बफर" पर ले जाता है। जब विम बंद हो जाता है, तो उपयोगकर्ता कमांड प्रॉम्प्ट की पिछली सामग्री को देखता है।सी # विंडोज कंसोल एप्लिकेशन कैसे करें जो पिछले कंसोल सामग्री का "सम्मान करता है"?

क्या कोई जानता है कि सी # का उपयोग करके इसे कैसे किया जाए?

धन्यवाद

संपादित करें: उपयोगकर्ता अब आवेदन के उत्पादन में देखना होगा। उम्मीद है कि यह बेहतर बताता है।

+1

उदाहरण का वर्णन यह है कि एक कमांड लाइन से लागू होने पर सी # कंसोल एप्लिकेशन वर्तमान में कैसे काम करेगा; यदि आप एक कंसोल ऐप निष्पादित करते हैं, तो इसे बंद करें, आपको अपनी पिछली कमांड लाइन पर वापस कर दिया जाता है। या क्या मैं कुछ न कुछ भूल रहा हूं? – Dutts

+0

मुझे लगता है कि पोस्टर का मतलब है कि ऐप से कोई आउटपुट अब कंसोल पर नहीं होना चाहिए, बल्कि निष्पादन से पहले क्या था। – Matt

+0

@ रिचर्ड अनुप्रयोग जैसे डीआईआर या बिल्ली एक ही कंसोल "बफर" पर फंस जाएगा। विम जैसे अनुप्रयोग आपकी कंसोल विंडो पर बहुत सारे टेक्स्ट को दोबारा हटाते हैं, लेकिन इसे बंद करने के बाद, उपयोगकर्ता वापस दिए गए आदेशों को देखने के लिए वापस जाता है, जिसमें विम भी शामिल है। खिड़की पर रखे गए सभी आउटपुट चले गए हैं। मुझे बताएं कि क्या मैं खुद को सही तरीके से समझा नहीं रहा हूं – robertoprs

उत्तर

4

मैं इस Vim source code को देखकर पता लगा प्रासंगिक बिट mch_init समारोह में os_win32.c में पाया जा सकता है, मैं 've की नकल की और यहां

/* Obtain handles for the standard Console I/O devices */ 
    if (read_cmd_fd == 0) 
    g_hConIn = GetStdHandle(STD_INPUT_HANDLE); 
    else 
    create_conin(); 
    g_hConOut = GetStdHandle(STD_OUTPUT_HANDLE); 

#ifdef FEAT_RESTORE_ORIG_SCREEN 
    /* Save the initial console buffer for later restoration */ 
    SaveConsoleBuffer(&g_cbOrig); 
    g_attrCurrent = g_attrDefault = g_cbOrig.Info.wAttributes; 
#else 
    /* Get current text attributes */ 
    GetConsoleScreenBufferInfo(g_hConOut, &csbi); 
    g_attrCurrent = g_attrDefault = csbi.wAttributes; 
#endif 
    if (cterm_normal_fg_color == 0) 
    cterm_normal_fg_color = (g_attrCurrent & 0xf) + 1; 
    if (cterm_normal_bg_color == 0) 
    cterm_normal_bg_color = ((g_attrCurrent >> 4) & 0xf) + 1; 

    /* set termcap codes to current text attributes */ 
    update_tcap(g_attrCurrent); 

    GetConsoleCursorInfo(g_hConOut, &g_cci); 
    GetConsoleMode(g_hConIn, &g_cmodein); 
    GetConsoleMode(g_hConOut, &g_cmodeout); 

#ifdef FEAT_TITLE 
    SaveConsoleTitleAndIcon(); 
    /* 
    * Set both the small and big icons of the console window to Vim's icon. 
    * Note that Vim presently only has one size of icon (32x32), but it 
    * automatically gets scaled down to 16x16 when setting the small icon. 
    */ 
    if (g_fCanChangeIcon) 
    SetConsoleIcon(g_hWnd, g_hVimIcon, g_hVimIcon); 
#endif 

तो यह केवल सांत्वना जानकारी (शीर्षक और चिह्न सहित) की बचत होती है प्रासंगिक बिट चिपकाया और उसके बाद बाहर निकलने पर इसे फिर से पुनर्स्थापित करता है।

दुर्भाग्यवश Console कक्षा स्क्रीन बफर की सामग्री तक पहुंच प्रदान नहीं करती है, इसलिए ऐसा करने के लिए आपको प्रासंगिक Win32 फ़ंक्शंस में P/Invoke करने की आवश्यकता होगी। के बजाय मौजूदा स्क्रीन बफर बस CreateConsoleScreenBuffer साथ एक नया बना कॉपी और सेट है कि बफर एक वर्तमान में SetConsoleActiveScreenBuffer का उपयोग कर दिखाया होने के लिए -

वैकल्पिक रूप से Win32 सांत्वना वास्तव में multiple screen buffers जो इस लागू करने के लिए एक आसान तरीका हो सकता है समर्थन करता है। दुर्भाग्य से Console वर्ग दुर्भाग्य से एकाधिक स्क्रीन बफर का समर्थन नहीं करता है, इसलिए आपको इसे करने के लिए पी/आमंत्रण की आवश्यकता होगी। इसके अलावा Console कक्षा हमेशा स्क्रीन बफर को लिखती है जो एप्लिकेशन को लॉन्च करने के समय सक्रिय था, इसलिए यदि आप सक्रिय स्क्रीन बफर को स्वैप करते हैं तो Console कक्षा अभी भी पुराने स्क्रीन बफर (जो अब दिखाई नहीं दे रही है) पर लिख रही है - इसके आस-पास पहुंचने के लिए आपको अपने सभी कंसोल एक्सेस को P/Invoke करना होगा, Working with Console Screen Buffers in .NET देखें।

+0

धन्यवाद! आप सही हैं, मुझे कोड को देखना चाहिए था। मैं भूल जाता हूं कि विंडोज़ दुनिया में कुछ परियोजनाएं अभी भी खुले स्रोत हैं। मैं jgauffin उत्तर के लिए CreateConsoleScreenBuffer धन्यवाद में कूद गया था, लेकिन पिछले बफर की स्थिति को सहेजना एक अच्छा विचार है! – robertoprs

+1

मूल बफर सामग्री को सहेजना आवश्यक है, क्योंकि बफर सक्रिय नहीं होने पर इसे साफ़ किया जाता है। – robertoprs

-3

मेरा मानना ​​है कि विम खुले फाइलों के इतिहास को रिकॉर्ड करता है और शायद यह बैकअप प्रतिलिपि की तरह ही उन्हें बफर करता है। सी # में ऐसा करने का विचार एक फ़ाइल बफर को लागू करना है, कुछ प्रकार का भंडारण जो आपके इच्छित चीजों को ट्रैक और रखेगा - इनपुट पैरामीटर इत्यादि।

यहां एक और समस्या यह है कि विम (वीआई की तरह) कमांड मोड जिसे किसी को भी सी # में लागू करने की आवश्यकता होगी। अब यह निर्भर करता है कि आप अपने सी # प्रोग्राम के साथ क्या हासिल करना चाहते हैं, यह एक संपादक है, फिर ठीक है, किसी भी मामले में, आपको कमांड और अन्य मोड के बीच अंतर करना होगा।

+1

इस प्रश्न के साथ बहुत कम करना है। – hvd

+0

मेरा मानना ​​है कि ओपी का सवाल अंधेरे में थोड़ा सा हिट था - बिल्कुल समझना आसान नहीं था। मैंने जवाब दिया कि मैंने क्या सोचा था कि सही था। –

+1

सवाल मुझे समझ में आता है। एक कमांड प्रॉम्प्ट खोलें। शुरू करो vim। ध्यान दें कि उसी विंडो में vim कैसे दिखाई देता है। विम से बाहर निकलें। ध्यान दें कि विम का कोई बिट दिखाई नहीं देता है। अब प्रश्न यह है कि सी # से काम करने के लिए कैसे करें। – hvd

0

आप को यहां बताए गए सांत्वना बफर करने के लिए पुरानी सामग्री लिख कर यह कर सकते हैं: How can I write fast colored output to Console?

+0

.. क्या आप पुरानी सामग्री प्राप्त करने का प्रस्ताव कर रहे हैं? –

+0

मैंने इसे ऊपर उठाया क्योंकि मुझे यह उपयोगी लगता है। मुझे PInvoke के बारे में पता नहीं था इसलिए मुझे पता नहीं था कि मैं सी # कोड से Win32 एपीआई कॉल कर सकता हूं। इसके लिए मुझे CreateConsoleScreenBuffer मिला। जस्टिन का जवाब अधिक विस्तृत है, लेकिन यह मुझे अनवरोधित करने के लिए काफी अच्छा था। – robertoprs

संबंधित मुद्दे