Как запустить консольное приложение C# со скрытой консолью

есть ли способ, чтобы скрыть окно консоли при выполнении консольного приложения?

в настоящее время я использую приложение Windows Forms для запуска консольного процесса, но я не хочу, чтобы окно консоли отображалось во время выполнения задачи.

12 ответов


Если вы используете ProcessStartInfo class вы можете установить стиль окна в hidden:

System.Diagnostics.ProcessStartInfo start =
      new System.Diagnostics.ProcessStartInfo();
start.FileName = dir + @"\Myprocesstostart.exe";
start.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;

Если вы написали консольное приложение, вы можете сделать его по умолчанию скрыты.

создайте новое консольное приложение, а затем измените тип" тип вывода "на" приложение Windows " (сделано в свойствах проекта)


Если вы используете класс процесса, то вы можете написать

yourprocess.StartInfo.UseShellExecute = false;
yourprocess.StartInfo.CreateNoWindow = true;

до yourprocess.start(); и процесс будет скрыт


простой ответ: перейдите к свойствам вашего консольного приложения (свойства проекта).На вкладке " приложение "просто измените" тип вывода "на"приложение Windows". Вот и все.


можно использовать FreeConsole API для отсоединения консоли от процесса:

[DllImport("kernel32.dll")]
static extern bool FreeConsole();

(конечно это применимо только если у вас есть доступ к консоли приложения исходный код)


Если вас интересует вывод, вы можете использовать эту функцию:

private static string ExecCommand(string filename, string arguments)
{
    Process process = new Process();
    ProcessStartInfo psi = new ProcessStartInfo(filename);
    psi.Arguments = arguments;
    psi.CreateNoWindow = true;
    psi.RedirectStandardOutput = true;
    psi.RedirectStandardError = true;
    psi.UseShellExecute = false;
    process.StartInfo = psi;

    StringBuilder output = new StringBuilder();
    process.OutputDataReceived += (sender, e) => { output.AppendLine(e.Data); };
    process.ErrorDataReceived += (sender, e) => { output.AppendLine(e.Data); };

    // run the process
    process.Start();

    // start reading output to events
    process.BeginOutputReadLine();
    process.BeginErrorReadLine();

    // wait for process to exit
    process.WaitForExit();

    if (process.ExitCode != 0)
        throw new Exception("Command " + psi.FileName + " returned exit code " + process.ExitCode);

    return output.ToString();
}

он запускает данную программу командной строки, ждет ее завершения и возвращает вывод в виде строки.


Если вы создаете программу, которая не требует ввода пользователя, вы всегда можете просто создать ее как службу. Служба не будет показывать какой-либо пользовательский интерфейс.


Я знаю, что не отвечаю точно, что вы хотите, но мне интересно, если вы задаете правильный вопрос.

Почему бы тебе не использовать:

  1. служба windows
  2. создайте новый поток и запустите свой процесс на этом

Это звучит как лучшие варианты, если все, что вы хотите, это запустить процесс.


хотя, как и другие ответы здесь, вы можете изменить "тип вывода" на "приложение Windows", имейте в виду, что это будет означать, что вы не можете использовать Console.In как он станет NullStreamReader.

Console.Out и Console.Error Кажется, все еще работает нормально.


добавьте это в свой класс, чтобы импортировать DLL-файл:

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

    const int SW_HIDE = 0;
    const int SW_SHOW = 5;

и потом, если вы хотите скрыть его используйте эту команду:

var handle = GetConsoleWindow();
ShowWindow(handle, SW_HIDE);

и если вы хотите показать консоль:

var handle = GetConsoleWindow();
ShowWindow(handle, SW_SHOW);

просто писать

ProcessStartInfo psi= new ProcessStartInfo("cmd.exe");
......

psi.CreateNoWindow = true;

основываясь на ответе Адама Марковица выше, следующее сработало для меня:

process = new Process();
process.StartInfo = new ProcessStartInfo("cmd.exe", "/k \"" + CmdFilePath + "\"");
process.StartInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;
//process.StartInfo.UseShellExecute = false;
//process.StartInfo.CreateNoWindow = true;
process.Start();