क्या कंसोल एप्लिकेशन को निष्पादित करते समय कंसोल विंडो को छिपाने का एक तरीका है?
मैं वर्तमान में कंसोल प्रक्रिया शुरू करने के लिए एक विंडोज फॉर्म एप्लिकेशन का उपयोग कर रहा हूं, लेकिन मैं नहीं चाहता कि कंसोल विंडो प्रदर्शित हो जबकि कार्य चल रहा है।
क्या कंसोल एप्लिकेशन को निष्पादित करते समय कंसोल विंडो को छिपाने का एक तरीका है?
मैं वर्तमान में कंसोल प्रक्रिया शुरू करने के लिए एक विंडोज फॉर्म एप्लिकेशन का उपयोग कर रहा हूं, लेकिन मैं नहीं चाहता कि कंसोल विंडो प्रदर्शित हो जबकि कार्य चल रहा है।
जवाबों:
यदि आप 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
यदि आपने कंसोल एप्लिकेशन को लिखा है तो आप इसे डिफ़ॉल्ट रूप से छिपा सकते हैं।
एक नया कंसोल ऐप बनाएं और फिर "आउटपुट प्रकार" प्रकार को "विंडोज एप्लिकेशन" में बदलें (परियोजना गुणों में किया गया)
यदि आप Process Class का उपयोग कर रहे हैं तो आप लिख सकते हैं
yourprocess.StartInfo.UseShellExecute = false;
yourprocess.StartInfo.CreateNoWindow = true;
पहले yourprocess.start();
और प्रक्रिया छिपी होगी
सरल उत्तर यह है कि: अपने कंसोल ऐप के गुणों (प्रोजेक्ट के गुणों) पर जाएं। "एप्लिकेशन" टैब में, "आउटपुट प्रकार" को "विंडोज एप्लिकेशन" में बदलें। बस इतना ही।
प्रक्रिया से कंसोल को अलग करने के लिए आप FreeConsole API का उपयोग कर सकते हैं :
[DllImport("kernel32.dll")]
static extern bool FreeConsole();
(बेशक यह केवल तभी लागू होता है जब आपके पास कंसोल एप्लिकेशन के स्रोत कोड तक पहुंच हो)
FreeConsole
इसका नाम क्या कहता है, यह विंडोज को कॉल करने से पहले कंसोल को दिखाने से नहीं रोकता है।
[DllImport("kernel32.dll")] static extern bool AllocConsole();
आप आसानी से एक मानक Win32 आवेदन से एक कंसोल के साथ चलाने के लिए अनुमति देता है
यदि आप आउटपुट में रुचि रखते हैं, तो आप इस फ़ंक्शन का उपयोग कर सकते हैं:
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();
}
यह दिए गए कमांड लाइन प्रोग्राम को चलाता है, इसे समाप्त करने के लिए इंतजार करता है और स्ट्रिंग के रूप में आउटपुट देता है।
यदि आप एक ऐसा प्रोग्राम बना रहे हैं जिसमें उपयोगकर्ता इनपुट की आवश्यकता नहीं है, तो आप इसे हमेशा एक सेवा के रूप में बना सकते हैं। एक सेवा किसी भी प्रकार की UI नहीं दिखाएगी।
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);
मुझे पता है कि मैं ठीक-ठीक जवाब नहीं दे रहा हूं कि आप क्या चाहते हैं, लेकिन मैं सोच रहा हूं कि क्या आप सही सवाल पूछ रहे हैं।
आप या तो उपयोग क्यों नहीं करते हैं:
यदि आप चाहते हैं तो बेहतर विकल्प की तरह ध्वनि एक प्रक्रिया को चलाने के लिए है।
यद्यपि अन्य उत्तरों के रूप में यहां कहा गया है कि आप "आउटपुट प्रकार" को "विंडोज एप्लिकेशन" में बदल सकते हैं, कृपया ध्यान रखें कि इसका मतलब यह होगा कि आप इसका उपयोग नहीं कर सकते Console.In
क्योंकि यह एक NullStreamReader बन जाएगा।
Console.Out
और Console.Error
अभी भी ठीक काम करने लगते हैं।
Console.In
जब कोई इनपुट करने के लिए कोई कंसोल नहीं है तो कोई क्यों उपयोग करेगा ? जहां से कुछ भी आ सकता है के माध्यम से पहुँचा जा सकता है Console.In
? इसका कोई मतलब नहीं है। दूसरे शब्दों में: यह कि पूरी तरह से स्पष्ट और तार्किक है Console.In
एक है NullStreamReader
इस मामले में।
ऊपर एडम 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();
मुझे साझा करने के लिए एक सामान्य समाधान मिला है:
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 स्टार्टअप पर कंसोल लॉन्च करने की मांग करता है । मुझे नहीं पता। जो भी कारण है, यह वर्ग मुझे पॉप अप करने के बाद आसानी से कंसोल को मारने की अनुमति देता है।
आशा है कि यह जादूगर किसी की मदद करे। ;)