छिपे हुए कंसोल के साथ C # कंसोल एप्लिकेशन को कैसे चलाएं


141

क्या कंसोल एप्लिकेशन को निष्पादित करते समय कंसोल विंडो को छिपाने का एक तरीका है?

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


कंसोल एप्लिकेशन को निर्धारित कार्य से चलाने का प्रयास करें।

जवाबों:


158

यदि आप ProcessStartInfoवर्ग का उपयोग कर रहे हैं, तो आप विंडो शैली को छिपाया जा सकता है - कंसोल (GUI नहीं) अनुप्रयोगों के मामले में, आपको CreateNoWindow सेट करना होगा true:

System.Diagnostics.ProcessStartInfo start =
      new System.Diagnostics.ProcessStartInfo();
start.FileName = dir + @"\Myprocesstostart.exe";
start.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden; //Hides GUI
start.CreateNoWindow = true; //Hides console

26
बस मैं क्या पोस्ट करने जा रहा था :)
जॉन स्कीट

75
पवित्र बकवास - जॉन से तेज़ कोई! =)
एरिक फोर्ब्स ने

75
मुझे उसे पीटने के लिए उसके इंटरनेट कनेक्शन को कुचलना पड़ा;)
एडम मार्कोविट्ज़

11
यह कमांड लाइन टूल को लागू करने के लिए काम नहीं करता था। Yourprocess.StartInfo.CreateNoWindow = true का उपयोग किया; इसके बजाय, नीचे देखें।
क्रिश्चियन

12
कंसोल विंडो को नहीं छुपाता है, StartInfo.CreateNoWindow = true की आवश्यकता है।
डैनियल

201

यदि आपने कंसोल एप्लिकेशन को लिखा है तो आप इसे डिफ़ॉल्ट रूप से छिपा सकते हैं।

एक नया कंसोल ऐप बनाएं और फिर "आउटपुट प्रकार" प्रकार को "विंडोज एप्लिकेशन" में बदलें (परियोजना गुणों में किया गया)


6
मैं अपने स्वयं के कंसोल को छिपाने की कोशिश कर रहा था, कुछ और नहीं बुला रहा था और फिर इसे छिपा रहा था (जैसे कि स्वीकृत उत्तर मानता है) - इसलिए यह मेरे लिए सबसे अच्छा था। धन्यवाद!

6
धन्यवाद दोस्त ! यही तो मैं भी चाह रहा था!
वरुण शर्मा

3
स्वीकृत उत्तर मानता है कि क्योंकि यह प्रश्न में कहा गया है।
एक्वा

सबसे सरल तरीका..सबसे अच्छा लगा..मैं निश्चित रूप से खिड़की को दिखाने के लिए नहीं करना चाहता हूँ क्योंकि यह मेरे लिए एक और प्रक्रिया शुरू करने जा रहा है ..
साईं अविनाश

1
यह प्रक्रिया ProcessStartInfo के साथ समस्याओं के आसपास हो जाती है जहां आप उपयोगकर्ता क्रेडेंशियल्स निर्दिष्ट करते हैं और उपयोगकर्ता उपयोगकर्ता या वर्तमान उपयोगकर्ता में लॉग इन होता है। उस स्थिति में CreateNoWindow संपत्ति को अनदेखा कर दिया जाता है ताकि आपको हमेशा एक कंसोल विंडो मिल सके। कंसोल एप्लिकेशन को विंडोज एप्लिकेशन पर सेट करके लेकिन बिना विंडो के तो आपको कोई विंडो नहीं मिलती है।
tjmoore

67

यदि आप Process Class का उपयोग कर रहे हैं तो आप लिख सकते हैं

yourprocess.StartInfo.UseShellExecute = false;
yourprocess.StartInfo.CreateNoWindow = true;

पहले yourprocess.start();और प्रक्रिया छिपी होगी


4
सौभाग्य है अगर आपको उस प्रक्रिया को जल्दी रोकना है। प्रक्रिया। किल अचानक समाप्त हो जाती है। प्रक्रिया .CloseMainWindow विफल। GenerateConsoleCtrlEvent प्रक्रिया में ctrl + c या ctrl + ब्रेक भेजने में विफल रहता है। प्रक्रिया में सभी थ्रेड विंडो के लिए WM_CLOSE विफल रहता है। ऐसा लगता है कि उन दो पैरामीटर मानों के साथ शुरू की गई प्रक्रिया को साफ करने का कोई तरीका नहीं है। मेरा प्रश्न यहाँ देखें: stackoverflow.com/questions/16139571/…
ट्राइंको

धन्यवाद टन यह सबसे सरल था। इसके अलावा, अगर आप कंसोल के लिए कोड स्वयं (या विभाग) रखते हैं, तो मुझे यह म्यूटेक्स उदाहरण मिला, जो स्वच्छ शटडाउन के लिए सबसे आसान है। stackoverflow.com/a/31586184/1877412
cbuteau

1
@ ट्रायनको: आप किसी भी प्रक्रिया को तब तक सफाई से समाप्त नहीं कर सकते, जब तक कि वह प्रक्रिया सक्रिय रूप से सहयोग न करे। यह झंडे या किसी और चीज का मामला नहीं है। ओएस में ऐसा कुछ भी नहीं है जो एक साफ शटडाउन को ट्रिगर कर सके। यहां सामान्य समाधान एक वफ़ल कर्नेल ऑब्जेक्ट का उपयोग करना है, जो कि नियंत्रण प्रक्रिया में संकेतित है, जब दास प्रक्रिया समाप्त होनी चाहिए। गुलाम प्रक्रिया को इस वफ़ादार वस्तु की स्थिति पर सक्रिय रूप से निगरानी रखने और संकेत मिलने के बाद स्वच्छ शटडाउन शुरू करने की आवश्यकता होती है।
IInspectable

43

सरल उत्तर यह है कि: अपने कंसोल ऐप के गुणों (प्रोजेक्ट के गुणों) पर जाएं। "एप्लिकेशन" टैब में, "आउटपुट प्रकार" को "विंडोज एप्लिकेशन" में बदलें। बस इतना ही।


4
बुल्सआई। यह विंडोज एप्लिकेशन बनाने के समान है जो किसी भी फॉर्म को कॉल नहीं करता है।
ashes999

1
यह सही जवाब है। आपका कोई दूसरा बंदा नहीं पहुंचता। यह वास्तविक अधिकार उत्तर है। आप चाहते हैं कि आपका एप्लिकेशन पहली बार में कोई कंसोल न खोले। इसके अलावा, आप किसी भी समय एक फॉर्म खोलने में सक्षम होना चाहते हैं। इसलिए आप जब चाहें तब फॉर्म को कॉल करें। जब उपयोगकर्ता सही सिस्टम ट्रे आइकन पर क्लिक करता है और वरीयताओं का चयन करता है तो हमारा फॉर्म कहा जाता है। यह सही जवाब है!!!
ब्लूबारन

20

प्रक्रिया से कंसोल को अलग करने के लिए आप FreeConsole API का उपयोग कर सकते हैं :

[DllImport("kernel32.dll")]
static extern bool FreeConsole();

(बेशक यह केवल तभी लागू होता है जब आपके पास कंसोल एप्लिकेशन के स्रोत कोड तक पहुंच हो)


मैं कंसोल नहीं दिखाना चाहता था। जबकि FreeConsoleइसका नाम क्या कहता है, यह विंडोज को कॉल करने से पहले कंसोल को दिखाने से नहीं रोकता है।
जादर डायस

5
फिर प्रोजेक्ट को विंडोज एप्लिकेशन के रूप में संकलित करें, न कि कंसोल एप्लीकेशन
थॉमस लेवेस्क

1
रिकॉर्ड के लिए, यह वही है जो मुझे चाहिए था, धन्यवाद। यह भी ठीक वैसा ही है जैसे शीर्षक पूछता है :) तो अन्य google voyagers के हित में, +1
sehe

3
इसके अलावा [DllImport("kernel32.dll")] static extern bool AllocConsole();आप आसानी से एक मानक Win32 आवेदन से एक कंसोल के साथ चलाने के लिए अनुमति देता है
sehe

1
मेरे .NET कोर 2.2 ऐप के लिए काम करता है - अगर कोई भी इसके लिए विशेष रूप से देख रहा है।
मेडिस्मल

7

यदि आप आउटपुट में रुचि रखते हैं, तो आप इस फ़ंक्शन का उपयोग कर सकते हैं:

private static string ExecCommand(string filename, string arguments)
{
    Process process = new Process();
    ProcessStartInfo psi = new ProcessStartInfo(filename);
    psi.Arguments = arguments;
    psi.CreateNoWindow = true;
    psi.RedirectStandardOutput = true;
    psi.RedirectStandardError = true;
    psi.UseShellExecute = false;
    process.StartInfo = psi;

    StringBuilder output = new StringBuilder();
    process.OutputDataReceived += (sender, e) => { output.AppendLine(e.Data); };
    process.ErrorDataReceived += (sender, e) => { output.AppendLine(e.Data); };

    // run the process
    process.Start();

    // start reading output to events
    process.BeginOutputReadLine();
    process.BeginErrorReadLine();

    // wait for process to exit
    process.WaitForExit();

    if (process.ExitCode != 0)
        throw new Exception("Command " + psi.FileName + " returned exit code " + process.ExitCode);

    return output.ToString();
}

यह दिए गए कमांड लाइन प्रोग्राम को चलाता है, इसे समाप्त करने के लिए इंतजार करता है और स्ट्रिंग के रूप में आउटपुट देता है।


4

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


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

2

DLL फ़ाइल आयात करने के लिए इसे अपनी कक्षा में जोड़ें:

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

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

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

और फिर यदि आप इसे छिपाना चाहते हैं तो इस कमांड का उपयोग करें:

 var handle = GetConsoleWindow();
 ShowWindow(handle, SW_HIDE);

और यदि आप कंसोल दिखाना चाहते हैं:

var handle = GetConsoleWindow();
ShowWindow(handle, SW_SHOW);

1
[DllImport ("user32.dll")] स्टैटिक एक्सटर्नल बूल शोविंडो (IntPtr hWnd, int nCmdShow); [DllImport ("kernel32.dll")] स्टेटिक एक्सटर्नल इंटप्रट GetConsoleWindow (); const int SW_HIDE = 0; const int SW_SHOW = 5;
२५:

1

मुझे पता है कि मैं ठीक-ठीक जवाब नहीं दे रहा हूं कि आप क्या चाहते हैं, लेकिन मैं सोच रहा हूं कि क्या आप सही सवाल पूछ रहे हैं।

आप या तो उपयोग क्यों नहीं करते हैं:

  1. विंडोज़ सेवा
  2. एक नया सूत्र बनाएँ और उस पर अपनी प्रक्रिया चलाएँ

यदि आप चाहते हैं तो बेहतर विकल्प की तरह ध्वनि एक प्रक्रिया को चलाने के लिए है।


3
वहाँ बहुत सारे परिदृश्य हैं जहाँ एक उपयोगिता कंसोल अनुप्रयोग लॉन्च करना पूरी तरह से वैध है।
एडम रॉबिन्सन

मेरे मामले में क्लाइंट / सर्वर मॉडल के कारण एक अलग प्रक्रिया आवश्यक है जो सॉफ्टवेयर मैं उपयोग कर रहा हूं।
एरॉन थॉमस

यह हमेशा एक नया धागा बनाने के लिए समस्या का समाधान नहीं करता है। ऐसे समय होते हैं जब आप पृष्ठभूमि में कष्टप्रद विंडो नहीं चाहते हैं। इसके अलावा, अगर आपके पास लूप में प्रोसेस.स्टार्ट है, तो आपको अपने चेहरे में कंसोल विंडो पॉप अप के रूप में कोई काम नहीं मिलेगा।
user890332

1
मैं टास्क शेड्यूलर से विंडोलेस यूटिलिटी कंसोल एप लॉन्च करता हूं। सेवा की कोई आवश्यकता नहीं है, और कोई भी मूल प्रक्रिया नहीं है जिसमें से एक धागा कांटा। यदि अतिरिक्त आउटपुट की आवश्यकता हो तो ये ऐप EventLog को लिखते हैं।
उप-

1

यद्यपि अन्य उत्तरों के रूप में यहां कहा गया है कि आप "आउटपुट प्रकार" को "विंडोज एप्लिकेशन" में बदल सकते हैं, कृपया ध्यान रखें कि इसका मतलब यह होगा कि आप इसका उपयोग नहीं कर सकते Console.Inक्योंकि यह एक NullStreamReader बन जाएगा।

Console.Outऔर Console.Errorअभी भी ठीक काम करने लगते हैं।


2
क्या आप गंभीर हैं? Console.Inजब कोई इनपुट करने के लिए कोई कंसोल नहीं है तो कोई क्यों उपयोग करेगा ? जहां से कुछ भी आ सकता है के माध्यम से पहुँचा जा सकता है Console.In? इसका कोई मतलब नहीं है। दूसरे शब्दों में: यह कि पूरी तरह से स्पष्ट और तार्किक है Console.Inएक है NullStreamReaderइस मामले में।
राबर्ट एस।

1
@RobertS। एक पाइप शायद। यानी दूसरे प्रोग्राम का आउटपुट। जब मैंने इसे खोजा तो यह मेरा उपयोग मामला था।
kjbartel

1

ऊपर एडम Markowitz के जवाब के आधार पर, निम्नलिखित मेरे लिए काम किया:

process = new Process();
process.StartInfo = new ProcessStartInfo("cmd.exe", "/k \"" + CmdFilePath + "\"");
process.StartInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;
//process.StartInfo.UseShellExecute = false;
//process.StartInfo.CreateNoWindow = true;
process.Start();

1

मुझे साझा करने के लिए एक सामान्य समाधान मिला है:

using System;
using System.Runtime.InteropServices;

namespace WhateverNamepaceYouAreUsing
{
    class Magician
    {
        [DllImport("kernel32.dll")]
        static extern IntPtr GetConsoleWindow();

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

        const int HIDE = 0;
        const int SHOW = 5;

        public static void DisappearConsole()
        {
            ShowWindow(GetConsoleWindow(), HIDE);
        }
    }
}

बस अपनी परियोजना में इस वर्ग को शामिल करें, और कॉल करें Magician.DisappearConsole();

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

मैं इसे एक डिस्कोर्ड बॉट के लिए करता हूं जो एक अदृश्य प्रक्रिया के रूप में मेरे कंप्यूटर की पृष्ठभूमि में हमेशा के लिए चलता है। मेरे लिए टॉपशेलफ में काम करने से ज्यादा आसान था। इससे पहले कि मैं कहीं और पाया कोड से कुछ मदद के साथ यह लिखने से पहले एक जोड़ी TopShelf ट्यूटोरियल मुझे विफल कर दिया। ; P

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

आशा है कि यह जादूगर किसी की मदद करे। ;)


0

बस लिखें

ProcessStartInfo psi= new ProcessStartInfo("cmd.exe");
......

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