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

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

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

+132
источник поделиться
13 ответов

Если вы используете класс 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
+150
источник

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

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

+186
источник
другие ответы

Связанные вопросы


Похожие вопросы

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

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

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

+66
источник

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

+41
источник

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

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

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

+19
источник

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

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
источник

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

+4
источник

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

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

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

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

+1
источник

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

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

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();
+1
источник

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

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 требует запуска консоли при запуске, Я не знаю. Безотносительно причины этот класс позволяет мне легко убить консоль после того, как она появляется.

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

+1
источник

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

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

0
источник

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

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

psi.CreateNoWindow = true;
0
источник

Посмотрите другие вопросы по меткам или Задайте вопрос