मैं एक फॉर्मेशन एप्लिकेशन में कंसोल आउटपुट / विंडो कैसे दिखाऊं?


131

सीधे में फंसने के लिए, एक बहुत ही बुनियादी उदाहरण:

using System;
using System.Windows.Forms;

class test
{ 
    static void Main()
    { 
        Console.WriteLine("test");
        MessageBox.Show("test");
    }
}

यदि मैं उम्मीद के अनुसार डिफ़ॉल्ट विकल्पों (कमांड लाइन पर csc का उपयोग करके) को संकलित करता हूं, तो यह एक कंसोल एप्लिकेशन को संकलित करेगा। इसके अलावा, क्योंकि मैंने आयात किया है System.Windows.Forms, यह एक संदेश बॉक्स भी दिखाएगा।

अब, यदि मैं विकल्प का उपयोग करता हूं /target:winexe, जो मुझे लगता है कि Windows Applicationपरियोजना के विकल्पों में से चुनने के समान है , तो उम्मीद है कि मैं केवल संदेश बॉक्स और कोई कंसोल आउटपुट नहीं देखूंगा।

(वास्तव में, जिस क्षण इसे कमांड लाइन से लॉन्च किया गया है, मैं आवेदन पूरा होने से पहले अगला कमांड जारी कर सकता हूं)।

तो, मेरा सवाल यह है - मुझे पता है कि आपके पास कंसोल एप्लिकेशन से "विंडोज़" / फॉर्म आउटपुट हो सकते हैं, लेकिन क्या विंडोज एप्लिकेशन से कंसोल को दिखाने के लिए वैसे भी है?


2
आप दोनों में क्या अंतर देखते हैं? क्यों न सिर्फ सांत्वना के रूप में संकलित करें और एक फॉर्म दिखाएं।
डोगेट

7
@ डोग्गेट, सरल - मैं सीख रहा हूं और समझना चाहता हूं कि ऐसा क्यों / कैसे करना है, भले ही मैं इसे कभी भी एक वास्तविक एप्लिकेशन में उपयोग नहीं करता हूं .... फिलहाल, मैं एक विकल्प के बारे में सोच रहा हूं जो अतिरिक्त आदेश देता है / वीएलसी जैसे आउटपुट, हालांकि टीबीएच, मुझे इसकी आवश्यकता नहीं है - फिर से, बस सीखना और इसे समझना चाहते हैं!
Wil

मैंने पूरा किया कि इस ट्यूटोरियल का उपयोग करें: saezndaree.wordpress.com/2009/03/29/…
vivanov

जवाबों:


153

यह काम करना चाहिए।

using System.Runtime.InteropServices;

private void Form1_Load(object sender, EventArgs e)
{
    AllocConsole();
}

[DllImport("kernel32.dll", SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
static extern bool AllocConsole();

8
बहुत बढ़िया, यह सवाल बहुत कुछ पूछा गया है, यह उस सवाल का एकमात्र वास्तविक उत्तर है जिसे मैं खोजने में सक्षम रहा हूँ, +1
रोबजॉनसन

5
मुख्य समस्या: जब आप इसे बंद करते हैं, तो सभी एप्लिकेशन बंद हो जाते हैं।
मार्क '

4
मैंने विंडोज 8 और विंडोज 10 पर परीक्षण किया: - AttachConsole एक cmd बॉक्स से काम करता है - AllocConsole Visual Studio से काम करता है। जब आवंटन की आवश्यकता होती है, तो AttachConsole गलत हो जाता है। कंसोल मोड में एप्लिकेशन को समाप्त करने से पहले आपको FreeConsole () भी कॉल करना चाहिए। मेरे कार्यक्रम में मैंने मैथ्यू स्ट्रॉब्रिज के कोड (नीचे देखें) का उपयोग किया, अटैचकोनसोल () लाइन के साथ संशोधित:: अगर (! AttachConsole (-1)) AllocConsole ();
बेरेंड एंगेलब्रेक्ट

क्या यह उपयोगकर्ता नियंत्रण में काम करेगा? मैं ग्रैनडोस (उदाहरण के लिए) का उपयोग कर एक winforms घटक के रूप में SSH नियंत्रण बनाने पर काम कर रहा हूं, और यह केवल पृष्ठभूमि घटक है। मैं इसके लिए एक अच्छे रैपर को जोड़ना चाहूंगा और साथ ही एक घटक में कंसोल का उपयोग कर सकता हूं।
क्रांग प्राइम

2
यह महान नहीं है, जब कमांड लाइन से चलाया जाता है तो यह एक अलग कंसोल विंडो खोलता है , और जब कमांड लाइन से चल रहा होता है और >आउटपुट को रीडायरेक्ट करने की कोशिश करता है तो मुझे अपनी फाइल में एक अलग कंसोल विंडो और जीरो आउटपुट मिलता है।
uglycoyote

139

शायद यह अति-सरल है ...

Windows प्रपत्र प्रोजेक्ट बनाएँ ...

फिर: प्रोजेक्ट गुण -> अनुप्रयोग -> आउटपुट प्रकार -> कंसोल एप्लीकेशन

फिर कंसोल और फॉर्म एक साथ चल सकते हैं, मेरे लिए काम करते हैं


2
सबसे सरल लगता है, मेरे मुद्दे को भी ठीक कर दिया।
Dadude999

2
यह निश्चित रूप से सबसे अच्छा समाधान है! अन्य स्मार्ट हैं लेकिन जटिल हैं
LM.Croisez

3
सरल और ठीक काम किया। यह स्वीकृत उत्तर होना चाहिए।
madu

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

2
यह एकमात्र समाधान है जहाँ मैं कमांड लाइन से चलने पर कंसोल पर आउटपुट लिखने के लिए या कमांड लाइन पर पुनर्निर्देशित होने पर फ़ाइल करने के लिए लिखने के लिए अपना Winforms ऐप प्राप्त करने में सक्षम हूं >। हालाँकि, मैं एक ऐसे समाधान की उम्मीद कर रहा था, जो यह बताएगा कि "कंसोल एप्लिकेशन" के रूप में कैसे चलाया जाए, केवल कुछ समय (यानी प्रोग्रामेटिक रूप से सक्षम करने के लिए जो कुछ भी यह रहस्यमय दृश्य स्टूडियो सेटिंग बदल रहा है)। क्या किसी को पता है कि यह हुड के तहत कैसे काम करता है?
uglycoyote

63

यदि आप कंसोल-ऑन-कमांड खोलने के बारे में चिंता नहीं कर रहे हैं, तो आप अपनी परियोजना के लिए गुणों में जा सकते हैं और इसे कंसोल एप्लिकेशन में बदल सकते हैं

प्रोजेक्ट प्रकार बदलने का स्क्रीनशॉट

यह अभी भी आपके फॉर्म को दिखाने के साथ-साथ एक कंसोल विंडो को पॉप अप करेगा। आप कंसोल विंडो को बंद नहीं कर सकते, लेकिन यह डीबगिंग के लिए एक उत्कृष्ट अस्थायी लकड़हारा के रूप में काम करता है।

प्रोग्राम को परिनियोजित करने से पहले इसे वापस बंद करना याद रखें।


1
अच्छा लगा। यह मेरे रूपों के आवेदन के साथ मेरे पास मौजूद समस्या का समाधान करता है, कि मुझे आउटपुट को किसी फ़ाइल में रीडायरेक्ट करने का समर्थन करते हुए कंसोल विंडो में आउटपुट करने में सक्षम होना चाहिए। और मुझे किसी भी कंसोल को मैन्युअल रूप से संलग्न करने की आवश्यकता नहीं है ...
काई हार्टमैन

2
@JasonHarrison यदि आप कंसोल विंडो को बंद करते हैं, तो प्रोग्राम बंद हो जाता है। साथ ही विंडो हमेशा खुली रहती है जबकि प्रोग्राम चलता है।
गन २२१ gun१

2
@ gun2171: धन्यवाद। इस दृष्टिकोण के नीचे उत्तर में नोट किया गया है: यदि आवेदन डबल क्लिक, स्टार्ट मेनू, आदि के साथ लॉन्च किया गया है तो कंसोल विंडो दिखाई देगी
जेसन हैरिसन

17

AttachConsoleWinForms प्रोजेक्ट से जुड़ी कंसोल विंडो पाने के लिए आप pinvoke का उपयोग कर कॉल कर सकते हैं : http://www.csharp411.com/console-output-from-winforms-application/

विभिन्न कॉन्फ़िगरेशन में लॉग आउटपुट को कॉन्फ़िगर करने के लिए आप Log4net ( http://log.apache.org/log4net/index.html ) पर भी विचार कर सकते हैं ।


+1 - वाह, मैं एक कंसोल के लिए उम्मीद कर रहा था। शो या समान! जितना मैंने सोचा था उससे कहीं अधिक जटिल! मैं उस क्षण के लिए खुला छोड़ दूंगा जब कोई बेहतर / आसान उत्तर होगा।
वि।

यह मेरे लिए काम किया, AllocConsole () इसलिए नहीं किया क्योंकि इसने एक नई कंसोल विंडो को जन्म दिया (AllocConsole में आगे खुदाई नहीं की, शायद मैं वहां कुछ याद किया)।
derFunk

14

यह मेरे लिए काम करता है, आउटपुट को एक फाइल में पाइप करने के लिए। कंसोल को कॉल करें

cmd / c "C: \ path \ to \ your \ application.exe"> myfile.txt

इस कोड को अपने एप्लिकेशन में जोड़ें।

    [DllImport("kernel32.dll")]
    static extern bool AttachConsole(UInt32 dwProcessId);
    [DllImport("kernel32.dll")]
    private static extern bool GetFileInformationByHandle(
        SafeFileHandle hFile,
        out BY_HANDLE_FILE_INFORMATION lpFileInformation
        );
    [DllImport("kernel32.dll")]
    private static extern SafeFileHandle GetStdHandle(UInt32 nStdHandle);
    [DllImport("kernel32.dll")]
    private static extern bool SetStdHandle(UInt32 nStdHandle, SafeFileHandle hHandle);
    [DllImport("kernel32.dll")]
    private static extern bool DuplicateHandle(
        IntPtr hSourceProcessHandle,
        SafeFileHandle hSourceHandle,
        IntPtr hTargetProcessHandle,
        out SafeFileHandle lpTargetHandle,
        UInt32 dwDesiredAccess,
        Boolean bInheritHandle,
        UInt32 dwOptions
        );
    private const UInt32 ATTACH_PARENT_PROCESS = 0xFFFFFFFF;
    private const UInt32 STD_OUTPUT_HANDLE = 0xFFFFFFF5;
    private const UInt32 STD_ERROR_HANDLE = 0xFFFFFFF4;
    private const UInt32 DUPLICATE_SAME_ACCESS = 2;
    struct BY_HANDLE_FILE_INFORMATION
    {
        public UInt32 FileAttributes;
        public System.Runtime.InteropServices.ComTypes.FILETIME CreationTime;
        public System.Runtime.InteropServices.ComTypes.FILETIME LastAccessTime;
        public System.Runtime.InteropServices.ComTypes.FILETIME LastWriteTime;
        public UInt32 VolumeSerialNumber;
        public UInt32 FileSizeHigh;
        public UInt32 FileSizeLow;
        public UInt32 NumberOfLinks;
        public UInt32 FileIndexHigh;
        public UInt32 FileIndexLow;
    }
    static void InitConsoleHandles()
    {
        SafeFileHandle hStdOut, hStdErr, hStdOutDup, hStdErrDup;
        BY_HANDLE_FILE_INFORMATION bhfi;
        hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);
        hStdErr = GetStdHandle(STD_ERROR_HANDLE);
        // Get current process handle
        IntPtr hProcess = Process.GetCurrentProcess().Handle;
        // Duplicate Stdout handle to save initial value
        DuplicateHandle(hProcess, hStdOut, hProcess, out hStdOutDup,
        0, true, DUPLICATE_SAME_ACCESS);
        // Duplicate Stderr handle to save initial value
        DuplicateHandle(hProcess, hStdErr, hProcess, out hStdErrDup,
        0, true, DUPLICATE_SAME_ACCESS);
        // Attach to console window – this may modify the standard handles
        AttachConsole(ATTACH_PARENT_PROCESS);
        // Adjust the standard handles
        if (GetFileInformationByHandle(GetStdHandle(STD_OUTPUT_HANDLE), out bhfi))
        {
            SetStdHandle(STD_OUTPUT_HANDLE, hStdOutDup);
        }
        else
        {
            SetStdHandle(STD_OUTPUT_HANDLE, hStdOut);
        }
        if (GetFileInformationByHandle(GetStdHandle(STD_ERROR_HANDLE), out bhfi))
        {
            SetStdHandle(STD_ERROR_HANDLE, hStdErrDup);
        }
        else
        {
            SetStdHandle(STD_ERROR_HANDLE, hStdErr);
        }
    }

    /// <summary>
    /// The main entry point for the application.
    /// </summary>
    [STAThread]
    static void Main(string[] args)
    {
        // initialize console handles
        InitConsoleHandles();

        if (args.Length != 0)
        {

            if (args[0].Equals("waitfordebugger"))
            {
                MessageBox.Show("Attach the debugger now");
            }
            if (args[0].Equals("version"))
            {
#if DEBUG
                String typeOfBuild = "d";
#else
                String typeOfBuild = "r";
#endif
                String output = typeOfBuild + Assembly.GetExecutingAssembly()
                    .GetName().Version.ToString();
                //Just for the fun of it
                Console.Write(output);
                Console.Beep(4000, 100);
                Console.Beep(2000, 100);
                Console.Beep(1000, 100);
                Console.Beep(8000, 100);
                return;
            }
        }
    }

मुझे यह कोड यहाँ मिला: http://www.csharp411.com/console-output-from-winforms-application/ मुझे लगा कि यह यहाँ भी पोस्ट करने योग्य है।


5
यह बहुत अच्छा काम करता है यह अब विंडोज 8 और विंडोज 10 में विफल रहता है। असफल होने से मेरा मतलब है कि इसके अलावा कोई आउटपुट नहीं है और अतिरिक्त संकेत (यदि यह एक सुराग है)। किसी ने भी एलोकोनकोस का सुझाव दिया, लेकिन सिर्फ एक cmd विंडो को फ्लैश किया।
साइमन हेफर

इसके अलावा ऊपर चेज़ के जवाब की कोशिश की, लेकिन यह विंडोज 7 में एक नया कंसोल देता है (8 या 10 में लथोफ नहीं)। मुझे केवल कमांड लाइन पर पुनर्निर्देशन के साथ चलने या एक gui के रूप में चलाने के लिए विकल्प की आवश्यकता है यदि कोई args नहीं है।
साइमन हेफर

मैंने यह कोशिश की लेकिन काम नहीं किया। बस के साथ AttachConsole(ATTACH_PARENT_PROCESS)मुझे कंसोल आउटपुट मिलता है लेकिन कमांड लाइन पर इसे पुनर्निर्देशित करने से >काम नहीं होता है। जब मैं इस उत्तर की कोशिश करता हूं, तो मुझे कंसोल में या किसी भी फाइल में कोई आउटपुट नहीं मिल सकता है।
uglycoyote

12

मूल रूप से दो चीजें हैं जो यहां हो सकती हैं।

कंसोल आउटपुट यह कंसोल विंडो के साथ खुद को संलग्न करने के लिए एक winforms प्रोग्राम के लिए संभव है, जो इसे बनाया है (या एक अलग कंसोल विंडो में, या वास्तव में एक नई कंसोल विंडो में यदि वांछित है)। एक बार कंसोल विंडो के साथ संलग्न करें कंसोल। क्राइटलाइन () आदि अपेक्षित रूप से काम करता है। इस दृष्टिकोण के लिए एक गेटा यह है कि प्रोग्राम तुरंत कंसोल विंडो पर नियंत्रण लौटाता है, और फिर इसे लिखने पर ले जाता है, इसलिए उपयोगकर्ता कंसोल विंडो में भी टाइप कर सकता है। मेरे विचार से इसे संभालने के लिए आप / वेट पैरामीटर के साथ शुरुआत का उपयोग कर सकते हैं।

कमांड सिंटैक्स शुरू करने के लिए लिंक

कंसोल कंसोल आउटपुट यह तब होता है जब कोई आपके प्रोग्राम से आउटपुट को कहीं और पाइप करता है, जैसे।

yourapp> file.txt

इस मामले में एक कंसोल विंडो में संलग्न करना पाइपिंग को प्रभावी रूप से अनदेखा करता है। इस काम को करने के लिए आप Console.OpenStandardOutput () को स्ट्रीम को हैंडल करने के लिए कह सकते हैं कि आउटपुट को पाइप किया जाना चाहिए। यह केवल तभी काम करता है जब आउटपुट पाइप किया जाता है, इसलिए यदि आप दोनों परिदृश्यों को संभालना चाहते हैं, तो आपको मानक आउटपुट खोलने और इसे लिखने और कंसोल विंडो से संलग्न करने की आवश्यकता है। इसका मतलब यह है कि आउटपुट कंसोल विंडो और पाइप पर भेजा जाता है लेकिन इसका सबसे अच्छा समाधान मुझे मिल सकता है। कोड के नीचे मैं ऐसा करने के लिए उपयोग करता हूं।

// This always writes to the parent console window and also to a redirected stdout if there is one.
// It would be better to do the relevant thing (eg write to the redirected file if there is one, otherwise
// write to the console) but it doesn't seem possible.
public class GUIConsoleWriter : IConsoleWriter
{
    [System.Runtime.InteropServices.DllImport("kernel32.dll")]
    private static extern bool AttachConsole(int dwProcessId);

    private const int ATTACH_PARENT_PROCESS = -1;

    StreamWriter _stdOutWriter;

    // this must be called early in the program
    public GUIConsoleWriter()
    {
        // this needs to happen before attachconsole.
        // If the output is not redirected we still get a valid stream but it doesn't appear to write anywhere
        // I guess it probably does write somewhere, but nowhere I can find out about
        var stdout = Console.OpenStandardOutput();
        _stdOutWriter = new StreamWriter(stdout);
        _stdOutWriter.AutoFlush = true;

        AttachConsole(ATTACH_PARENT_PROCESS);
    }

    public void WriteLine(string line)
    {
        _stdOutWriter.WriteLine(line);
        Console.WriteLine(line);
    }
}

मैं कंसोल पर लिखने में सक्षम नहीं था; माता-पिता की प्रक्रिया को जोड़कर सबसे पहले चाल चली। धन्यवाद।
20

ऐसा लगता है कि इस उत्तर के लिए आपको उपरोक्त सभी कॉलों को फिर से लिखने के Console.WriteLineबजाय सभी कॉलों को फिर से लिखना होगा WriteLine। भले ही मैंने कोशिश की कि मैं कमांड कोड पर एप्लिकेशन को चलाने और किसी फ़ाइल के साथ पुनर्निर्देशित करने पर फ़ाइल को पुनर्निर्देशित करने के लिए इस कोड के साथ असमर्थ था >
uglycoyote

@uglycoyote, सुनिश्चित करें कि आप अपने आवेदन में जल्द से जल्द GUIConsoleWriter का निर्माण कर रहे हैं, अन्यथा यह रहस्यमय विंडोज़ प्रकार के कारणों के लिए काम नहीं करेगा। मेरा तर्क है कि कॉल को इनकैप्सुलेट करना Console.WriteLineकेवल अच्छा अभ्यास है, क्योंकि यह आपको परीक्षण करने की अनुमति देता है, और उन जगहों को आसानी से बदलने के लिए जिन्हें आप लॉग इन करते हैं (उदाहरण के लिए, आप पेपरट्रेल जैसी क्लाउड आधारित लॉगिंग सेवा में लॉगिंग शुरू करना चाहते हैं, या जो भी हो )
cedd

यह मेरे लिए Win10 में भी बिना ठीक काम कियाStreamWriter _stdOutWriter;
TS

पाइपिंग का जवाब है, लेकिन एक फ़ाइल के बजाय, बस अधिक का उपयोग करें, जैसे: Yourapp | अधिक ; कृपया stackoverflow.com/a/13010823/1845672
रोलैंड

9

एक विंडोज फॉर्म एप्लिकेशन बनाएं, और आउटपुट प्रकार को कंसोल में बदलें।

यह एक कंसोल और खोलने के लिए फॉर्म दोनों के परिणामस्वरूप होगा ।

यहाँ छवि विवरण दर्ज करें


यह वही है जिसकी मुझे तलाश है। सरल और WinAPI का उपयोग नहीं।
माइकल कॉक्सन

मैंने कई उदाहरणों की कोशिश की है, लेकिन उनमें से कोई भी ऐसा परिणाम नहीं निकला जिसने मेरी उम्मीदों को पूरा किया हो। हालांकि यह समाधान वही है जो मैं चाहता था और अब तक का सबसे आसान समाधान है।
निर्वासित

4
//From your application set the Console to write to your RichTextkBox 
//object:
Console.SetOut(new RichTextBoxWriter(yourRichTextBox));

//To ensure that your RichTextBox object is scrolled down when its text is 
//changed add this event:
private void yourRichTextBox_TextChanged(object sender, EventArgs e)
{
    yourRichTextBox.SelectionStart = yourRichTextBox.Text.Length;
    yourRichTextBox.ScrollToCaret();
}

public delegate void StringArgReturningVoidDelegate(string text);
public class RichTextBoxWriter : TextWriter
{
    private readonly RichTextBox _richTextBox;
    public RichTextBoxWriter(RichTextBox richTexttbox)
    {
        _richTextBox = richTexttbox;
    }

    public override void Write(char value)
    {
        SetText(value.ToString());
    }

    public override void Write(string value)
    {
        SetText(value);
    }

    public override void WriteLine(char value)
    {
        SetText(value + Environment.NewLine);
    }

    public override void WriteLine(string value)
    {
        SetText(value + Environment.NewLine);
    }

    public override Encoding Encoding => Encoding.ASCII;

    //Write to your UI object in thread safe way:
    private void SetText(string text)
    {
        // InvokeRequired required compares the thread ID of the  
        // calling thread to the thread ID of the creating thread.  
        // If these threads are different, it returns true.  
        if (_richTextBox.InvokeRequired)
        {
            var d = new StringArgReturningVoidDelegate(SetText);
            _richTextBox.Invoke(d, text);
        }
        else
        {
            _richTextBox.Text += text;
        }
    }
}

3
using System;
using System.Runtime.InteropServices;

namespace SomeProject
{
    class GuiRedirect
    {
    [DllImport("kernel32.dll", SetLastError = true)]
    private static extern bool AttachConsole(int dwProcessId);
    [DllImport("kernel32.dll", SetLastError = true)]
    private static extern IntPtr GetStdHandle(StandardHandle nStdHandle);
    [DllImport("kernel32.dll", SetLastError = true)]
    private static extern bool SetStdHandle(StandardHandle nStdHandle, IntPtr handle);
    [DllImport("kernel32.dll", SetLastError = true)]
    private static extern FileType GetFileType(IntPtr handle);

    private enum StandardHandle : uint
    {
        Input = unchecked((uint)-10),
        Output = unchecked((uint)-11),
        Error = unchecked((uint)-12)
    }

    private enum FileType : uint
    {
        Unknown = 0x0000,
        Disk = 0x0001,
        Char = 0x0002,
        Pipe = 0x0003
    }

    private static bool IsRedirected(IntPtr handle)
    {
        FileType fileType = GetFileType(handle);

        return (fileType == FileType.Disk) || (fileType == FileType.Pipe);
    }

    public static void Redirect()
    {
        if (IsRedirected(GetStdHandle(StandardHandle.Output)))
        {
            var initialiseOut = Console.Out;
        }

        bool errorRedirected = IsRedirected(GetStdHandle(StandardHandle.Error));
        if (errorRedirected)
        {
            var initialiseError = Console.Error;
        }

        AttachConsole(-1);

        if (!errorRedirected)
            SetStdHandle(StandardHandle.Error, GetStdHandle(StandardHandle.Output));
    }
}

1
कमांड प्रॉम्प्ट से ठीक काम करता है, लेकिन स्टार्ट> रन या विजुअल स्टूडियो से नहीं। इसे सभी मामलों में काम करने के लिए, AttachConsole लाइन को इसके द्वारा प्रतिस्थापित करें: if (! AttachConsole (-1)) AllocConsole (); यदि AllocConsole () कहा जाता है, FreeConsole () भी कहा जाना चाहिए, अन्यथा कंसोल होस्ट प्रोग्राम को समाप्त करने के बाद भी चालू रहता है।
बेरेंड एंगेलब्रैच सेप

2
InitialiseOut और initialiseError का इरादा उपयोग क्या है, क्योंकि उनका उपयोग नहीं किया जाता है?
एडविन

StandardHandle : uintयहाँ गलत है ... दोनों x86 और x64 पर काम करने के लिए IntPtr होना चाहिए
दिमित्री गुसरोव

1

आप किसी भी समय किसी भी प्रकार के अनुप्रयोगों के बीच स्विच कर सकते हैं, कंसोल या विंडोज़ पर। तो, आप स्टडआउट को देखने के लिए विशेष तर्क नहीं लिखेंगे। इसके अलावा, डिबगर में एप्लिकेशन चलाने पर, आपको आउटपुट विंडो में सभी स्टडआउट दिखाई देंगे। आप बस एक ब्रेकप्वाइंट भी जोड़ सकते हैं, और ब्रेकपॉइंट गुणों में "जब हिट ..." बदल जाते हैं, तो आप किसी भी संदेश, और चर को आउटपुट कर सकते हैं। इसके अलावा आप "जारी रखें निष्पादन" को चेक / अनचेक कर सकते हैं, और आपका ब्रेकपॉइंट चौकोर आकार का हो जाएगा। इसलिए, डीबग आउटपुट विंडो में एप्लिकेशन में कुछ भी चेंज किए बिना ब्रेकपॉइंट संदेश।


0

क्यों न इसे केवल विंडो फॉर्म ऐप के रूप में छोड़ दें, और कंसोल की नकल करने के लिए एक सरल रूप बनाएं। प्रपत्र ब्लैक-स्क्रीन कंसोल की तरह दिखने के लिए बनाया जा सकता है, और यह सीधे कुंजी प्रेस पर प्रतिक्रिया करता है। फिर, program.cs फ़ाइल में, आप तय करते हैं कि आपको मुख्य फ़ॉर्म या कंसोलफ़ॉर्म को चलाने की आवश्यकता है या नहीं। उदाहरण के लिए, मैं इस दृष्टिकोण का उपयोग program.cs फ़ाइल में कमांड लाइन तर्कों को पकड़ने के लिए करता हूं। मैं कंसोल कंसोल बनाता हूं, शुरू में इसे छिपाता हूं, फिर कमांड लाइन स्ट्रिंग्स को इसमें AddCommand फ़ंक्शन से गुजारें, जो अनुमत कमांड प्रदर्शित करता है। अंत में, अगर उपयोगकर्ता ने -h या - दिया? कमांड, मैं कंसोल पर .Show को कॉल करता हूं और जब उपयोगकर्ता इस पर कोई कुंजी मारता है, तो मैं प्रोग्राम को बंद कर देता हूं। यदि उपयोगकर्ता - नहीं देता है? कमांड, मैं छिपे हुए कंसोल को बंद कर देता हूं और मुख्य फॉर्म को रन करता हूं।


2
नमस्कार और StackOverflow में आपका स्वागत है, प्रश्नों को उत्तर के रूप में पोस्ट करने से बचें, टिप्पणी अनुभाग का उपयोग करें।
पेड्रो रॉड्रिक्स
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.