C # कंसोल एप्लिकेशन की कंसोल विंडो दिखाएं / छिपाएं


191

मैं अपने कंसोल विंडो को छिपाने के तरीके के बारे में जानकारी के लिए चारों ओर घूमता हूं। आश्चर्यजनक रूप से, एकमात्र समाधान जो मुझे मिल सकता था, वह था हैकॉई समाधान, जो इसके शीर्षक द्वाराFindWindow() कंसोल विंडो को खोजने के लिए शामिल था । मैंने विंडोज एपीआई में थोड़ा गहरा खोदा और पाया कि बहुत बेहतर और आसान तरीका है, इसलिए मैं इसे दूसरों को खोजने के लिए यहां पोस्ट करना चाहता था।

आप अपने स्वयं के C # कंसोल एप्लिकेशन से जुड़ी कंसोल विंडो को कैसे छिपाते हैं (और दिखाते हैं)?

जवाबों:


265

ऐसे:

using System.Runtime.InteropServices;

[DllImport("kernel32.dll")]
static extern IntPtr GetConsoleWindow();

[DllImport("user32.dll")]
static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);

const int SW_HIDE = 0;
const int SW_SHOW = 5;

var handle = GetConsoleWindow();

// Hide
ShowWindow(handle, SW_HIDE);

// Show
ShowWindow(handle, SW_SHOW);

14
विंडो अभी भी शुरुआत में दिखाई देती है। मुझे लगता है कि इसके आसपास कोई रास्ता नहीं है, जब तक कि आवेदन का प्रकार बदल नहीं जाता है?
साइरन गलाघेर

2
यह अच्छा होगा अगर उसके आसपास कोई रास्ता हो। इस तरह मैं कंसोल को तब दिखा सकता हूं जब मैं डिबग मोड में हूं, लेकिन जब मैं सामान्य रन मोड में होता हूं तो बस अपना प्रोग्राम और एग्जिट (बिना किसी विंडो के) चलाएं।
14

8
@Vaccano: csprojफ़ाइल को मैन्युअल रूप से संपादित करके केवल डिबग मोड में आपके एप्लिकेशन को कंसोल एप्लिकेशन बनाना संभव है । Visual Studio के पास ऐसा करने के लिए GUI नहीं है, लेकिन यदि आप csprojफ़ाइल को सही ढंग से संपादित करते हैं तो यह सेटिंग का सम्मान करेगा ।
टिवी

3
आवश्यकता:using System.Runtime.InteropServices;
एंथनी निकोल्स

5
यह एक बहुत अच्छा जवाब है, लेकिन मैं जोड़ सकता हूं कि जोड़ने के लिए एक और विकल्प है const int SW_SHOWMINIMIZED = 2;और फिर ShowWindow(handle, SW_SHOWMINIMIZED); इस तरह से कंसोल छिपाना शुरू नहीं होता है, बस कम से कम।
कांसईरोबोट

265

बस एप्लिकेशन के गुणों पर जाएं और कंसोल एप्लिकेशन से विंडोज एप्लिकेशन तक आउटपुट प्रकार बदलें ।


9
हालांकि यह ओपी के सवाल का जवाब नहीं देता है, मैं वास्तव में इस जवाब को देने की सराहना करता हूं। यह ठीक वैसा ही था जैसा मुझे चाहिए :)
kayleeFrye_onDeck

6
यह समाधान नहीं है, क्योंकि इस तरह से विंडो नहीं दिखाई जा सकती है।
माइकल वॉलीस्की

6
यह कोई समाधान नहीं है कि पोस्टर ने क्या पूछा।
कांसईरोबोट

1
महान होते हुए, यह समाधान आपको कंसोल को दिखाने और छिपाने के लिए प्रोग्रामेटिक रूप से नियंत्रित करने की अनुमति नहीं देता है। कहते हैं कि आप एक कंसोल परम स्वीकार करते हैं, जो सेट करते समय आप अपने कंसोल (यानी साइलेंट मोड, वर्बोज़ = गलत) को छिपाना चाहते हैं
TheLegendaryCopyCoder

3
यह बहुत अच्छा है जब आप अपनी मुख्य निष्पादन योग्य फ़ाइल को पृष्ठभूमि में अद्यतन करना चाहते हैं और फिर उसे चलाएं। धन्यवाद
एहसान

22

यदि आप कंसोल को स्वयं छिपाना चाहते हैं, तो आपको कंसोल एप्लिकेशन की आवश्यकता क्यों है? =)

मैं कंसोल एप्लिकेशन के बजाय विंडोज आउटपुट के लिए प्रोजेक्ट आउटपुट प्रकार सेट करने की सलाह देता हूं । यह आपको कंसोल विंडो नहीं दिखाएगा, लेकिन सभी कार्यों को निष्पादित करेगा, जैसे कंसोल एप्लिकेशन करते हैं।


28
क्योंकि एक समय आ सकता है जब मैं वास्तव में इसे दिखाना चाहता हूं। जैसे, कंसोल एप्लिकेशन सामान करने की कोशिश करता है और सफल होने के साथ ही किसी को परेशान नहीं करता है। यदि नहीं, तो यह पॉप अप करता है और मुझे सीएलआई प्रदान करता है।
Janis F

यह भी TopShelfआप को चलाने के लिए अनुमति देता है Consolesएक सेवा के रूप और इस टूट जाता है कि
श्री Heelis

यदि आप चाहते हैं कि मानक एक कंसोल में उपलब्ध हो, तो आपको एक कंसोल की आवश्यकता होगी, जो सरल है।
टोटे कार्ल्ससन

20

आप उलटा कर सकते हैं और अनुप्रयोग आउटपुट प्रकार को इसमें सेट कर सकते हैं: Windows अनुप्रयोग। फिर इस कोड को एप्लिकेशन की शुरुआत में जोड़ें।

[DllImport("kernel32.dll", EntryPoint = "GetStdHandle", SetLastError = true, CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
public static extern IntPtr GetStdHandle(int nStdHandle);

[DllImport("kernel32.dll", EntryPoint = "AllocConsole", SetLastError = true, CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
public static extern int AllocConsole();

private const int STD_OUTPUT_HANDLE = -11;
private const int MY_CODE_PAGE = 437;
private static bool showConsole = true; //Or false if you don't want to see the console

static void Main(string[] args)
{
    if (showConsole)
    {
        AllocConsole();
        IntPtr stdHandle = GetStdHandle(STD_OUTPUT_HANDLE);
        Microsoft.Win32.SafeHandles.SafeFileHandle safeFileHandle = new Microsoft.Win32.SafeHandles.SafeFileHandle(stdHandle, true);
        FileStream fileStream = new FileStream(safeFileHandle, FileAccess.Write);
        System.Text.Encoding encoding = System.Text.Encoding.GetEncoding(MY_CODE_PAGE);
        StreamWriter standardOutput = new StreamWriter(fileStream, encoding);
        standardOutput.AutoFlush = true;
        Console.SetOut(standardOutput);
    }

    //Your application code
}

इस कोड को कंसोल दिखाएगा यदि showConsoleहैtrue


यह वास्तव में कंसोल को ब्लिंकिंग कर्सर के साथ दिखाता है, लेकिन न तो कंसोल। क्राइटलाइन ("टेक्स्ट") और न ही standardOutput.WriteLine ("टेक्स्ट") मेरे मामले में कुछ भी दिखाता है। कुछ याद आ रहा है?
रॉनी डी'होर

9

मेरी पोस्ट यहाँ देखें:

विंडोज एप्लिकेशन में कंसोल दिखाएं

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


अति उत्कृष्ट! कंसोल को छिपाने का सबसे आसान तरीका प्रोजेक्ट प्रकार को विंडोज एप्लिकेशन में बदलना है।

4

"बस छिपाने के लिए" आप कर सकते हैं:

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

और इसके बजाय Console.Readline/keyआप new ManualResetEvent(false).WaitOne()ऐप को चालू रखने के लिए अंत में उपयोग कर सकते हैं ।


1

यदि आप विंडो टाइटल के उपयोग पर निर्भर नहीं होना चाहते हैं:

    [DllImport("user32.dll")]
    static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);

...

    IntPtr h = Process.GetCurrentProcess().MainWindowHandle;
    ShowWindow(h, 0);
    Application.EnableVisualStyles();
    Application.SetCompatibleTextRenderingDefault(false);
    Application.Run(new FormPrincipale());

हमें DllImport ("fullPath") में dll फ़ाइल का पूर्ण पथ देना होगा /
तुषार गुप्ता - क्युरीट्यूशर

0

यदि आपको एक छोटे से बैच एप्लिकेशन को एकीकृत करने में कोई समस्या नहीं है, तो CmVA.exe नामक यह प्रोग्राम है जो आपको कंसोल शीर्षक के आधार पर कंसोल विंडो को छिपाने की अनुमति देगा।

Console.Title = "MyConsole";
System.Diagnostics.Process HideConsole = new System.Diagnostics.Process();
HideConsole.StartInfo.UseShellExecute = false;
HideConsole.StartInfo.Arguments = "MyConsole /hid";
HideConsole.StartInfo.FileName = "cmdow.exe";
HideConsole.Start();

Exe को समाधान में जोड़ें, बिल्ड एक्शन को "कंटेंट" पर सेट करें, कॉपी को आउटपुट डायरेक्टरी में सेट करें जो आपको सूट करता है, और cmando कंसोल विंडो को छिपा देगा जब इसे चलाया जाता है।

कंसोल को फिर से दिखाई देने के लिए, आप केवल तर्क बदलते हैं

HideConsole.StartInfo.Arguments = "MyConsole /Vis";
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.