Показать / скрыть окно консоли консольного приложения C #

192

Я нашел информацию о том, как спрятать собственное окно консоли. Удивительно, но единственными решениями, которые я смог найти, были хакерские решения, связанные FindWindow()с поиском окна консоли по его названию . Я углубился в Windows API и обнаружил, что есть гораздо лучший и более простой способ, поэтому я хотел опубликовать его здесь, чтобы другие могли его найти.

Как скрыть (и показать) окно консоли, связанное с моим собственным консольным приложением C #?

Timwi
источник

Ответы:

268

Просто зайдите в Свойства приложения и измените Тип вывода с Консольного приложения на Приложение Windows .

Fahad
источник
9
Хотя это и не отвечает на вопрос ОП, я действительно ценю, что вы дали этот ответ. Это было именно то, что мне было нужно :)
kayleeFrye_onDeck
6
Это не решение, потому что это окно не может быть показано.
Михал Волиньски
6
Это не решение того, что задал плакат.
KansaiRobot
2
Несмотря на то, что это отличное решение, оно не позволяет программно контролировать, когда показывать и скрывать консоль. Допустим , вы принимаете консоль из параметров , которые при установке вы хотите скрыть консоль (т.е. бесшумный режим, многословен = ложь)
TheLegendaryCopyCoder
3
Это замечательно, когда вы хотите обновить основной исполняемый файл в фоновом режиме, а затем запустить его. спасибо
Эхсан
266

Вот как:

using System.Runtime.InteropServices;

[DllImport("kernel32.dll")]
static extern IntPtr GetConsoleWindow();

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

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

var handle = GetConsoleWindow();

// Hide
ShowWindow(handle, SW_HIDE);

// Show
ShowWindow(handle, SW_SHOW);
Timwi
источник
14
Окно все еще появляется на мгновение в начале. Я думаю, что нет никакого способа обойти это, если тип приложения не изменился?
Кьяран Галлахер
2
Было бы хорошо, если бы был способ обойти это. Таким образом, я могу показать консоль, когда я нахожусь в режиме отладки, но просто запустить мою программу и выйти (без окна), когда я нахожусь в режиме нормального запуска.
Ваккано
8
@Vaccano: Сделать приложение консольным в режиме отладки можно только путем редактирования csprojфайла вручную. В Visual Studio нет графического интерфейса для этого, но он сохранит настройки, если вы csprojправильно отредактируете файл.
Тимви
3
Нужно:using System.Runtime.InteropServices;
Энтони Николс
5
Это очень хороший ответ, но я мог бы добавить, что добавляется еще одна опция: const int SW_SHOWMINIMIZED = 2;затем ShowWindow(handle, SW_SHOWMINIMIZED); консоль запускается не скрытой, а просто свернутой.
KansaiRobot
22

Зачем вам консольное приложение, если вы хотите скрыть консоль? знак равно

Я рекомендую установить тип вывода проекта в Windows Application вместо консольного приложения. Он не покажет вам окно консоли, но выполнит все действия, как это делает консольное приложение.

Саша
источник
28
Потому что может наступить момент, когда я действительно захочу это показать. Например, консольное приложение пытается выполнять какие-то действия и никого не беспокоит, пока оно успешно. Если нет, он появляется и предлагает мне CLI.
Янис Ф
также TopShelfпозволяет вам работать Consolesв качестве службы, и это нарушает это
мистер Хилис
Если вы хотите, чтобы стандартный консоль была доступна в консоли, то вам понадобится консоль, такая простая.
Тотте Карлссон
20

Вы можете сделать обратное и установить тип вывода приложения: Приложение Windows. Затем добавьте этот код в начало приложения.

[DllImport("kernel32.dll", EntryPoint = "GetStdHandle", SetLastError = true, CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
public static extern IntPtr GetStdHandle(int nStdHandle);

[DllImport("kernel32.dll", EntryPoint = "AllocConsole", SetLastError = true, CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
public static extern int AllocConsole();

private const int STD_OUTPUT_HANDLE = -11;
private const int MY_CODE_PAGE = 437;
private static bool showConsole = true; //Or false if you don't want to see the console

static void Main(string[] args)
{
    if (showConsole)
    {
        AllocConsole();
        IntPtr stdHandle = GetStdHandle(STD_OUTPUT_HANDLE);
        Microsoft.Win32.SafeHandles.SafeFileHandle safeFileHandle = new Microsoft.Win32.SafeHandles.SafeFileHandle(stdHandle, true);
        FileStream fileStream = new FileStream(safeFileHandle, FileAccess.Write);
        System.Text.Encoding encoding = System.Text.Encoding.GetEncoding(MY_CODE_PAGE);
        StreamWriter standardOutput = new StreamWriter(fileStream, encoding);
        standardOutput.AutoFlush = true;
        Console.SetOut(standardOutput);
    }

    //Your application code
}

Этот код покажет Консоль, если showConsoleестьtrue

Майко Кингма
источник
1
Это действительно показывает консоль с мигающим курсором, но ни Console.WriteLine ("text"), ни standardOutput.WriteLine ("text") ничего не показывают в моем случае. Чего-то не хватает?
Ронни Д'Хур
9

Смотрите мой пост здесь:

Показать консоль в приложении Windows

Вы можете создать приложение для Windows (с окном или без него) и показывать консоль по желанию. При использовании этого метода окно консоли никогда не появляется, если вы явно не показываете его. Я использую его для двухрежимных приложений, которые я хочу запускать в консольном или графическом режиме в зависимости от того, как они открываются.

Энтони
источник
Превосходно! Самый простой способ скрыть консоль - изменить тип проекта на приложение Windows.
4

«Просто спрятать» можно:

Измените тип вывода с Консольного приложения на Приложение Windows ,

И вместо этого Console.Readline/keyвы можете использовать new ManualResetEvent(false).WaitOne()в конце, чтобы приложение работало.

NT
источник
1

Если вы не хотите, чтобы это зависело от заголовка окна, используйте это:

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

...

    IntPtr h = Process.GetCurrentProcess().MainWindowHandle;
    ShowWindow(h, 0);
    Application.EnableVisualStyles();
    Application.SetCompatibleTextRenderingDefault(false);
    Application.Run(new FormPrincipale());
тряпка
источник
мы должны указать полный путь к файлу dll в DllImport ("fullPath") /
Тушар Гупта - curioustushar
0

Если у вас нет проблем с интеграцией небольшого пакетного приложения, существует программа Cmdow.exe , которая позволяет скрывать окна консоли в зависимости от заголовка консоли.

Console.Title = "MyConsole";
System.Diagnostics.Process HideConsole = new System.Diagnostics.Process();
HideConsole.StartInfo.UseShellExecute = false;
HideConsole.StartInfo.Arguments = "MyConsole /hid";
HideConsole.StartInfo.FileName = "cmdow.exe";
HideConsole.Start();

Добавьте exe-файл в решение, установите для действия сборки значение «Содержимое», установите для параметра «Копировать в выходной каталог» то, что вам подходит, и cmdow скроет окно консоли при запуске.

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

HideConsole.StartInfo.Arguments = "MyConsole /Vis";
ScilsOff
источник