15

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

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

  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;
    }
}
4

4 に答える 4

9

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

cmd.exe が必要な場合でも、ウィンドウを非表示にすることができます。開始には /B オプションを使用する必要があります。開始 /? と入力します。コマンドプロンプトでオプションを表示します。START COPY は使用できません。

xcopy.exe にも特定の癖があります。入力もリダイレクトしないと実行されません。診断なしで実行に失敗するだけです。

于 2010-08-09T14:11:51.533 に答える
5

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

例えば

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

procStartInfo.WindowStyle = ProcessWindowStyle.Hidden;
于 2010-08-09T13:42:01.280 に答える
4

追加してみることができます

process.StartInfo.UseShellExecute = false; 

あなたのプロセスに

于 2012-11-14T17:55:55.550 に答える
0

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

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

新しいウィンドウのハンドルがわかっている場合は、呼び出すことができます

ShowWindow(hWnd, 0);

0 でウィンドウを非表示、1 でウィンドウを表示

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

pinvoke.net enumwindows(user32)

于 2015-05-04T15:02:59.713 に答える