2010-08-09 15 views
15

में कमांड विंडो छुपाएं इससे पहले कि आप इसे एक डुप्लिकेट प्रश्न कहें, कृपया मुझे समझाएं (जैसा कि मैंने सभी समान धागे पढ़े हैं)।सी # अनुप्रयोग

मेरा आवेदन इन दोनों सेटिंग है:

procStartInfo.CreateNoWindow = true; 
    procStartInfo.WindowStyle = ProcessWindowStyle.Hidden; 

है और यह भी है WindowsApplication उत्पादन प्रकार के रूप में है।

जब मैं कमांड लाइन कमांड कॉल करता हूं तो काला विंडो तब तक आती है जब मैं कमांड लाइन कमांड कहता हूं। क्या खिड़की छिपाने के लिए मैं कुछ और कर सकता हूं? यह सभी आदेशों के लिए नहीं होता है, एक्ससीओपीवाई एक ऐसी स्थिति है जहां यह काला खिड़की चमकती है। यह केवल तभी होता है जब मैं जिस स्थान पर XCOPYING में पहले से ही फ़ाइल शामिल करता हूं और यह मुझे संकेत दे रहा है कि मैं इसे बदलना चाहता हूं। यहां तक ​​कि अगर मैं/वाई पास करता हूं तो भी यह संक्षिप्त रूप से फ़्लैश हो जाएगा।

मैं vbscript का उपयोग करने के लिए खुला हूं अगर इससे मदद मिलेगी, लेकिन कोई अन्य विचार?

ग्राहक मेरी निष्पादन कॉल करेंगे और फिर एक कमांड लाइन आदेश यानी में पारित:

class Program 
{ 
    static void Main(string[] args) 
    {  
      string command = GetCommandLineArugments(args); 

      // /c tells cmd that we want it to execute the command that follows and then exit. 
      System.Diagnostics.ProcessStartInfo procStartInfo = new System.Diagnostics.ProcessStartInfo("cmd.exe", "/c " + command); 

      procStartInfo.RedirectStandardOutput = true; 
      procStartInfo.UseShellExecute = false; 

      // Do not create the black window. 
      procStartInfo.CreateNoWindow = true; 
      procStartInfo.WindowStyle = ProcessWindowStyle.Hidden; 

      System.Diagnostics.Process process = new System.Diagnostics.Process(); 
      process.StartInfo = procStartInfo; 
      process.Start(); 

     } 

    private static string GetCommandLineArugments(string[] args) 
    { 
     string retVal = string.Empty; 

     foreach (string arg in args) 
      retVal += " " + arg; 


     return retVal; 
    } 
} 
+0

आप अपने 'Process' /' ProcessStartInfo' ग के बाकी पोस्ट कर सकते हैं स्तोत्र? –

+3

@ फ़्लेचर: यह प्रश्न में कहा गया है कि आउटपुट प्रकार विंडोज एप्लिकेशन है और कंसोल नहीं है। मैंने इसका परीक्षण आउटपुट प्रकार के साथ विंडोज ऐप पर किया है और यह ठीक काम करता है। @now: मैं आपकी आउटपुट टाइप सेटिंग को दोबारा जांचूंगा। – nukefusion

+0

@ फ़्लेचर वास्तव में समस्या का प्रकार है! मैं खिड़की के लिए बिल्कुल प्रदर्शित नहीं करना चाहता! – mint

उत्तर

9

समस्या यह है कि आप cmd.exe का उपयोग कर रहे हैं। केवल इसकी कंसोल विंडो छिपी जाएगी, न कि उस प्रक्रिया के लिए कंसोल विंडो जो आप इसे शुरू करने के लिए कहते हैं। Cmd.exe का उपयोग करने में थोड़ा सा बिंदु है, जब तक कि आप कुछ आदेशों को निष्पादित करने का प्रयास नहीं कर रहे हैं, यह स्वयं लागू होता है। कॉपी की तरह।

यदि आपको cmd.exe की आवश्यकता है तो भी आप विंडो को दबा सकते हैं, आपको स्टार्ट के लिए/B विकल्प का उपयोग करना होगा। स्टार्ट/टाइप करें? विकल्पों को देखने के लिए कमांड प्रॉम्प्ट पर। यह नहीं कि यह मदद करता है, आप स्टार्ट कॉपी का उपयोग नहीं कर सकते हैं।

xcopy.exe में एक विशिष्ट क्विर्क है जो आपको भी फेंक सकता है। यह निष्पादित करता है यदि आप इनपुट को रीडायरेक्ट भी नहीं करते हैं। यह केवल निदान के बिना चलाने में विफल रहता है।

+0

/बी ने xcopy कमांड के लिए काम किया है, जो कि हमें ईमानदार होने की आवश्यकता हो सकती है। – mint

4

मैं देखते हैं कि आप बुला रहे हैं:

C:\MyProgram.exe start XCOPY c:\Test.txt c:\ProgramFiles\

यहाँ आवेदन का पूरा कोड है cmd और फिर पैरामीटर के रूप में कमांड पास कर रहा है। इसके बजाय सीधे आदेश

उदा।

System.Diagnostics.ProcessStartInfo procStartInfo = new System.DiagnosticsProcessStartInfo("xcopy", "<sourcedir> <destdir> <other parameters>"); 

procStartInfo.WindowStyle = ProcessWindowStyle.Hidden; 
+0

दिखाई देते हैं, शायद मुझे इस सवाल में यह कहना चाहिए था, लेकिन ग्राहक मेरे प्रोग्राम के लिए जो भी कमांड लाइन कमांड चाहता है, उसे पास कर देगा, इसलिए मैं हार्ड कोड xcopy नहीं कर सकता, फिर भी आपको दबाया गया है! – mint

+1

@ पता है, आप अभी भी जो भी कहते हैं वह कर सकते हैं, 'ProcessStartInfo procStartInfo = new ProcessStartInfo (Arg [0], String.Join ("", Arg.Skip (1)। ToArray()); –

+0

@now xcopy बस था उदाहरण के लिए –

4

आप अपने प्रक्रिया

+2

बस उत्तर को स्पष्ट करने के लिए। आपको 'process.StartInfo.UseShellExecute = झूठा; 'और' प्रक्रिया। स्टार्टइन्फो। क्रिएटनोविंडो = झूठा; '। वे दोनों एक साथ प्रक्रिया विंडो को छिपाएंगे –

+1

@ रेमी: आपको' प्रक्रिया की आवश्यकता है। स्टार्टइन्फो। क्रिएटनोविंडो = सत्य; ' – Sjoerd222888

+0

मुझे त्रुटि मिलती है "सिस्टम नहीं मिल रहा है फ़ाइल निर्दिष्ट है। "यह तब भी है जब मैंने सिस्टम पैथ चर में कस्टम कमांड जोड़ा है। – Najeeb

0

को

process.StartInfo.UseShellExecute = false; 

जोड़ने मैं एक ऐसी ही चुनौती थी कोशिश कर सकते हैं - यह एक API कॉल के माध्यम निर्माण के बाद खिड़की को छिपाने के लिए संभव है। (आपके मामले में आपको शायद एक सहायक धागा की आवश्यकता हो सकती है।)

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

आप नए विंडो का हैंडल जानते हैं कि आप, 1 कॉल कर सकते हैं

ShowWindow(hWnd, 0); 

0 खिड़की छुपाता खिड़की

से पता चलता खिड़की के हत्थे एक बार देख ले पाने के लिए पर:

pinvoke.net enumwindows(user32)

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