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

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

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

Ответ 1

Вот как:

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

Ответ 2

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

Ответ 3

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

Я рекомендую установить для Project Output типа Приложение Windows вместо приложения Консоль. Он не покажет вам консольное окно, но выполните все действия, например, приложение консоли.

Ответ 4

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

[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

Ответ 5

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

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

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

Ответ 6

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

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

Ответ 7

Если у вас нет проблемы с интегрированием небольшого пакетного приложения, есть эта программа под названием 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";

Ответ 8

"Чтобы скрыть", вы можете использовать:

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

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