web-dev-qa-db-ja.com

C#アプリケーションでコマンドウィンドウを非表示にする

重複する質問を言う前に、説明させてください(同様のスレッドをすべて読んだので)。

私のアプリケーションには、次の両方の設定があります。

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

また、出力タイプとしてWindowsApplicationがあります。

コマンドラインコマンドを呼び出すと、黒いウィンドウが表示されます。ウィンドウを非表示にするために他にできることはありますか?すべてのコマンドで発生するわけではありません。XCOPYは、黒いウィンドウが点滅する状況です。これは、XCOPYしている宛先にもすでにファイルが含まれていて、それを置き換えるかどうかを確認するメッセージが表示された場合にのみ発生します。/Yを渡しても、短時間点滅します。

それが助けになるなら、私はvbscriptを使用することにオープンですが、他のアイデアはありますか?

クライアントは私の実行可能ファイルを呼び出してから、コマンドラインコマンドを渡します。

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

アプリケーションの完全なコードは次のとおりです。

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;
    }
}
15
mint

問題は、cmd.exeを使用していることです。 itsコンソールウィンドウのみが非表示になり、開始を要求したプロセスのコンソールウィンドウは非表示になりません。 cmd.exeがそれ自体で実装するコマンドのいくつかを実行しようとしない限り、cmd.exeを使用する意味はほとんどありません。 COPYのように。

Cmd.exeが必要な場合でも、ウィンドウを非表示にすることができます。開始には/ Bオプションを使用する必要があります。 start /?と入力します。コマンドプロンプトでオプションを表示します。それが役立つわけではありません。STARTCOPYを使用することはできません。

Xcopy.exeには、あなたを思いとどまらせるかもしれない特定の癖があります。入力をリダイレクトしない場合は、not実行されます。診断なしでは実行に失敗します。

9
Hans Passant

cmdを呼び出して、コマンドをパラメーターとして渡していることがわかります。代わりに、コマンドを直接呼び出します

例えば.

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

procStartInfo.WindowStyle = ProcessWindowStyle.Hidden;
4
ajay_whiz

追加してみてください

process.StartInfo.UseShellExecute = false; 

あなたのプロセスに

4
Andrei C

同様のタスクがありました-API呼び出しを介して作成後にウィンドウを非表示にすることが可能です。 (あなたの場合、おそらくヘルパースレッドが必要です。)

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

新しいウィンドウのハンドルがわかっている場合は、

ShowWindow(hWnd, 0);

0はウィンドウを非表示にし、1はウィンドウを表示します

ウィンドウのハンドルを取得するには、以下を参照してください。

pinvoke.net enumwindows(user32)

0
Cadburry