4

更新を確認するために小さな.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、迷惑なブラックボックスがポップアップ表示されます。アプリはstdoutに書き込みますが、私はそれをデバッグにのみ使用し、ユーザーはそれが生成するテキストを実際に見るべきではありません。UseShellExecuteRedirectStandardOutput

おそらくCreateNoWindow、および/またはRedirectStandardOutputボックスがポップアップするのを防ぐ必要がありますが、これらの変数をどのように設定してもかまいません。

4

3 に答える 3

5

コマンドラインアプリケーションをWinformsアプリケーションに設定しますが、通常のように実行時にフォームを開かないでください。

于 2010-02-06T01:05:42.677 に答える
3

次のように、起動時にウィンドウを非表示にできます。

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-d525cc22dcbd

于 2010-02-06T01:12:06.030 に答える
0

これは、アクティブな接続でMACに問い合わせるサンプルコードです。これはコンソールアプリケーションであり、これをWindowsフォームにする必要はありません...

    パブリッククラスTestARP
    {{
        private StringBuilder sbRedirectedOutput = new StringBuilder();
        パブリック文字列OutputData
        {{
            get {return this.sbRedirectedOutput.ToString(); }
        }

        //非同期!
        public void Run()
        {{
            System.Diagnostics.ProcessStartInfo ps = new System.Diagnostics.ProcessStartInfo();
            ps.FileName = "arp";
            ps.ErrorDialog = false;
            ps.Arguments = "-a";
            ps.CreateNoWindow = true; //これをコメントアウト
            ps.UseShellExecute = false; //true
            ps.RedirectStandardOutput = true; // false
            ps.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden; //これをコメントアウト

            using(System.Diagnostics.Process proc = new System.Diagnostics.Process())
            {{
                proc.StartInfo = ps;
                proc.Exited + = new EventHandler(proc_Exited);
                proc.OutputDataReceived + = new System.Diagnostics.DataReceivedEventHandler(proc_OutputDataReceived);
                proc.Start();
                proc.WaitForExit();
                proc.BeginOutputReadLine(); //これをコメントアウトします
            }
        }

        void proc_Exited(object sender、EventArgs e)
        {{
            System.Diagnostics.Debug.WriteLine( "proc_Exited:Process Ended");
        }

        void proc_OutputDataReceived(オブジェクト送信者、System.Diagnostics.DataReceivedEventArgs e)
        {{
            if(e.Data!= null)this.sbRedirectedOutput.Append(e.Data + Environment.NewLine);
        }
    }

ここで、Run非同期モードで、単一のコンソールウィンドウとして実行されるメソッドを見てください。実際、余分なウィンドウがポップアップしない通常のコンソールアプリケーションです。コメントに注意してください。これらの行を変更すると、同期になります。プロセスのシェルアウトを非常に迅速に行うと、このコンソールがコマンドの出力を含む別のウィンドウを作成することに気付くでしょうarp。非同期モードであるため、出力はイベントハンドラーにリダイレクトされ、イベントハンドラーはデータをStringBuilderインスタンスに詰め込んでさらに処理します...

これがお役に立てば幸いです、よろしく、トム。

于 2010-02-06T01:38:59.430 に答える