Скрыть командное окно в приложении C#

прежде чем вы скажете, что это дублирующий вопрос, Позвольте мне объяснить (поскольку я прочитал все подобные темы).

мое приложение имеет оба этих параметра:

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

и также имеет WindowsApplication как тип вывода.

черное окно все еще появляется, когда я вызываю команду командной строки. Я могу еще что-нибудь сделать, чтобы спрятать окно? Это происходит не для всех команд, XCOPY-это ситуация, когда черное окно действительно вспыхивает. Этот только случается, хотя когда пункт назначения, который я тоже XCOPYing, уже содержит файл, и он подсказывает мне, Хочу ли я его заменить. Даже если я пройду в /Y, он все равно будет мигать ненадолго.

Я открыт для использования vbscript, если это поможет, но любые другие идеи?

клиент вызовет мой исполняемый файл, а затем передаст в командной строке команду ie:

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 ответов


проблема в том, что вы используете cmd.исполняемый. Только его окно консоли будет скрыто, а не окно консоли для процесса, который вы попросите его запустить. В использовании cmd мало смысла.exe, если вы не пытаетесь выполнить некоторые из команд, которые он реализует сам. Как копия.

вы все еще можете подавить окно, Если вам нужен cmd.exe, вам нужно будет использовать параметр /B для запуска. Введите start/? в командной строке, чтобы увидеть варианты. Это не помогает, вы не можете используйте START COPY.

в xcopy есть определенная причуда.exe, который может сбить вас с толку. Это не выполнить, если вы не перенаправлять ввод. Он просто не может работать без диагностики.


Я вижу, что ты называешь cmd и затем передача команды в качестве параметров. Вместо этого вызовите команду напрямую

например

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

procStartInfo.WindowStyle = ProcessWindowStyle.Hidden;

вы можете попробовать добавить

process.StartInfo.UseShellExecute = false; 

код


у меня была аналогичная задача-можно скрыть окно После создания с помощью вызова API. (В вашем случае вам может понадобиться вспомогательная нить.)

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

Если вы знаете дескриптор нового окна вы можете позвонить

ShowWindow(hWnd, 0);

0 скрывает окно, 1 показывает окно

чтобы получить ручку окна, взгляните на:

pinvoke.net enumwindows (user32)