Suppress نافذة الأوامر من تطبيق سطر الأوامر البدء مع .NET

StackOverflow https://stackoverflow.com/questions/2211514

سؤال

لدي وحدة تحتاج إلى تشغيل برنامج سطر الأوامر .NET صغير للتحقق من التحديثات. كل شيء يعمل بشكل رائع، ومع ذلك أواجه مشكلة في قمع إخراج موجه الأوامر من عرضها.

يحتوي التطبيق على نموذج Windows الخاص الذي ينبثقه إذا اكتشف تحديثا. يحتاج التحديث إلى تشغيل كأداة منفصلة بسبب حقيقة أنه يتطلب سياق تنفيذ مختلف من DLL الذي تم إطلاقه منه.

string path = System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location) + "\\" + AUTO_UPDATE_EXENAME;

updater.StartInfo.FileName = path;
updater.StartInfo.Arguments = AUTO_UPDATE_PARAMETERS;
updater.StartInfo.CreateNoWindow = false;
updater.StartInfo.UseShellExecute = false;
updater.StartInfo.RedirectStandardOutput = true;
updater.StartInfo.WorkingDirectory = path;

updater.Start();

لقد جربت معظم مجموعات العمل المختلفة من CreateNoWindow, UseShellExecute, ، و RedirectStandardOutput وكل منهم ينتج عنه الصندوق الأسود المزعج ظهرت. يقوم التطبيق بالكتابة إلى Stdout ولكني استخدم فقط من أجل تصحيح الأخطاء ويجب ألا يرى المستخدم حقا النص الذي يولده.

من المفترض CreateNoWindow و / أو RedirectStandardOutput يجب أن يمنع المربع من ظهرت، لكنه لا يهم كيف وضعت هذه المتغيرات.

هل كانت مفيدة؟

المحلول

قم بتعيين تطبيق سطر الأوامر على تطبيق WinForms، ولكن لا تفتح نموذجا عند تنفيذها، كما تفعل عادة.

نصائح أخرى

يمكنك إخفاء النافذة عند بدء التشغيل مثل هذا:

using System.Runtime.InteropServices;

namespace MyConsoleApp {    
    class Program    {        

        [DllImport("user32.dll")]        
        public static extern IntPtr FindWindow(string lpClassName,
                                               string lpWindowName);   

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

        [STAThread()]
        static void Main(string[] args)        
        {          
            Console.Title = "MyConsoleApp";

            if (args.StartWith("-w"))            
            {                   
                // hide the console window                    
                setConsoleWindowVisibility(false, Console.Title);                   
                // open your form                    
                Application.EnableVisualStyles();
                Application.SetCompatibleTextRenderingDefault(false);                    
                Application.Run( new frmMain() );           
            }           
            // else don't do anything as the console window opens by default    
        }        

        public static void setConsoleWindowVisibility(bool visible, string title)       
        {             
            //Sometimes System.Windows.Forms.Application.ExecutablePath works  
            // for the caption depending on the system you are running under.           
            IntPtr hWnd = FindWindow(null, title); 

            if (hWnd != IntPtr.Zero)            
            {               
                if (!visible)                   
                    //Hide the window                    
                    ShowWindow(hWnd, 0); // 0 = SW_HIDE                
                else                   
                     //Show window again                    
                    ShowWindow(hWnd, 1); //1 = SW_SHOWNORMA           
             }        
        }
    }
}

http://social.msdn.microsoft.com/forums/en/csharpgeneral/thread/ea8b0fd5-a660-46f9-9dcb-d525cc22dcd.

إليك رمز مثال يستجمع MAC في الاتصال النشط، هذا هو تطبيق وحدة التحكم، لا حاجة لجعل نموذج Windows هذا ...

 الفئة العامة TESTARP {Private StringBuilder SBREDIREATETUTPUT = جديد StringBuilder ()؛ Outstratta السلسلة العامة Data {احصل على {ارجع this.sbredirectutoutput.tostring ()؛ } } // غير متزامن! باطلة عامة التشغيل () {system.diagnostics.processstartinfo ps = new system.diagnostics.processstartinfo ()؛ ps.filename = "ARP"؛ ps.errordialog = false؛ Ps.Argums = "-a"؛ ps.createnowindow = صحيح؛ // تعليق هذا خارج ps.useshellexecute = خطأ؛ // true ps.redirectedardoutoutoutoutput = صحيح؛ // false ps.windowstyle = system.diagnostics.processwindowstyle.hidden؛ // تعليق هذا باستخدام (system.diagnostics.process proc = system.diagnostics.process ()) {proc.startinfo = ps؛ proc.exted + = eventhandler جديد (proc_exted)؛ proc.outputdatareceed + = new system.diagnostics.datareceivedeventhandler (proc_outputtatareceed)؛ proc.start ()؛ proc.waitforexit ()؛ proc.beginoutputreadline ()؛ // تعليق هذا خارج}} Void Proc_Extored (كائن المرسل، EventArgs E) {system.diagnostics.debug.wrog.wrog.wrog.writeline ("proc_xrited: العملية المنتهية")؛ } Void Proc_outputTatareceiSt (مرسل الكائنات، System.Diagnostics.datareceivedEventargs E) {IF (E.DATA! = null) this.sbredirectutoutput.append (e.data + encyny.newline)؛ }}

الآن، انظر إلى Run الطريقة، أي في الوضع غير المتزامن، وتشغيل نافذة وحدة تحكم واحدة - في الواقع تطبيق وحدة التحكم العادية مع عدم وجود نافذة إضافية ظهرت، لاحظ التعليقات، إذا كنت لتغيير تلك الخطوط، فإنها تصبح عملية جراحية متزامنة، جدا بسرعة، ستلاحظ أن هذه وحدة التحكم ستقوم بإنشاء نافذة أخرى مع إخراج الأمر arp. وبعد لأنه في وضع غير متزامن، يتم إعادة توجيه الإخراج إلى معالج الأحداث التي تخوضع البيانات في StringBuilder مثيل لمزيد من المعالجة ...

نأمل أن يساعد هذا، مع أطيب التحيات، توم.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top