Как запустить консольное приложение C # со скрытой консолью - PullRequest
132 голосов
/ 07 мая 2009

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

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

Ответы [ 13 ]

186 голосов
/ 08 мая 2009

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

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

150 голосов
/ 07 мая 2009

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

System.Diagnostics.ProcessStartInfo start =
      new System.Diagnostics.ProcessStartInfo();
start.FileName = dir + @"\Myprocesstostart.exe";
start.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;
66 голосов
/ 11 мая 2009

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

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

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

41 голосов
/ 03 сентября 2010

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

19 голосов
/ 07 мая 2009

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

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

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

7 голосов
/ 09 апреля 2015

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

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

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

4 голосов
/ 08 мая 2009

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

1 голос
/ 01 ноября 2018

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

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

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

1 голос
/ 14 июля 2017

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

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 голос
/ 06 июля 2016

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