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

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

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

Ответ 1

Если вы используете класс ProcessStartInfo вы можете установить скрытый стиль окна - в случае консольных (не GUI) приложений вы должны установить CreateNoWindow в true:

System.Diagnostics.ProcessStartInfo start =
      new System.Diagnostics.ProcessStartInfo();
start.FileName = dir + @"\Myprocesstostart.exe";
start.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden; //Hides GUI
start.CreateNoWindow = true; //Hides console

Ответ 2

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

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

Ответ 3

Если вы используете Process Class, вы можете написать

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

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

Ответ 4

Простой ответ: Перейдите в свойства приложения консоли (свойства проекта). На вкладке "Приложение" просто измените "Тип вывода" на "Приложение Windows". Это все.

Ответ 5

Вы можете использовать API FreeConsole, чтобы отсоединить консоль от процесса:

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

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

Ответ 6

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

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();
}

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

Ответ 7

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

Ответ 8

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

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

  • служба Windows
  • создайте новый поток и запустите процесс на

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

Ответ 9

Добавьте это в свой класс, чтобы импортировать 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);

Ответ 10

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

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();

Ответ 11

У меня есть общее решение, которым можно поделиться:

using System;
using System.Runtime.InteropServices;

namespace WhateverNamepaceYouAreUsing
{
    class Magician
    {
        [DllImport("kernel32.dll")]
        static extern IntPtr GetConsoleWindow();

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

        const int HIDE = 0;
        const int SHOW = 5;

        public static void DisappearConsole()
        {
            ShowWindow(GetConsoleWindow(), HIDE);
        }
    }
}

Просто включите этот класс в свой проект и вызовите Magician.DisappearConsole(); ,

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

Я делаю это для Discord Bot, который работает вечно на заднем плане моего компьютера как невидимый процесс. Это было проще, чем заставить TopShelf работать на меня. Несколько учебников TopShelf не помогли мне, прежде чем я написал это с помощью кода, который я нашел в другом месте. ;П

Я также попытался просто изменить настройки в Visual Studio> Project> Properties> Application для запуска в качестве приложения Windows вместо консольного приложения, и что-то в моем проекте не позволило скрыть мою консоль - возможно, из-за того, что DSharpPlus требует запуска консоли при запуске, Я не знаю. Безотносительно причины этот класс позволяет мне легко убить консоль после того, как она появляется.

Надеюсь, этот волшебник кому-нибудь поможет. ;)

Ответ 12

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

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

Ответ 13

Просто напишите

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

psi.CreateNoWindow = true;