Показать / скрыть окно консоли консольного приложения C#
Я нашел информацию о том, как спрятать собственное окно консоли. Удивительно, но единственные решения, которые я мог найти, были хакерские решения, которые включали FindWindow()
найти консольное окно по его названию. Я немного углубился в Windows API и обнаружил, что есть намного лучший и простой способ, поэтому я хотел опубликовать его здесь, чтобы другие могли его найти.
Как скрыть (и показать) окно консоли, связанное с моим собственным консольным приложением C#?
10 ответов
Вот как:
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);
Просто зайдите в Свойства приложения и измените Тип вывода с Консольного приложения на Приложение Windows.
Вы можете сделать обратное и установить тип вывода приложения: Приложение 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
Зачем вам консольное приложение, если вы хотите скрыть консоль? знак равно
Я рекомендую установить тип вывода проекта в Windows Application вместо консольного приложения. Он не покажет вам окно консоли, но выполнит все действия, как это делает консольное приложение.
Смотрите мой пост здесь:
Показать консоль в приложении Windows
Вы можете создать приложение для Windows (с окном или без него) и отображать консоль по желанию. При использовании этого метода окно консоли никогда не появляется, если вы явно не показываете его. Я использую его для двухрежимных приложений, которые я хочу запускать в консольном или графическом режиме в зависимости от того, как они открываются.
"Просто спрятать" можно:
Измените тип вывода с Консольного приложения на Приложение Windows,
И вместо Console.Readline/key
ты можешь использовать new ManualResetEvent(false).WaitOne()
в конце, чтобы приложение работало.
Следуя ответу Timwi, я создал вспомогательный класс для переноса необходимого кода:
using System;
using System.Runtime.InteropServices;
static class ConsoleExtension {
const int SW_HIDE = 0;
const int SW_SHOW = 5;
readonly static IntPtr handle = GetConsoleWindow();
[DllImport("kernel32.dll")] static extern IntPtr GetConsoleWindow();
[DllImport("user32.dll")] static extern bool ShowWindow(IntPtr hWnd,int nCmdShow);
public static void Hide() {
ShowWindow(handle,SW_HIDE); //hide the console
}
public static void Show() {
ShowWindow(handle,SW_SHOW); //show the console
}
}
Если вы не хотите зависеть от заголовка окна, используйте это:
[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());
Если у вас нет проблем с интеграцией небольшого пакетного приложения, есть программа 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";
Чтобы изменить тип вывода с консольного приложения на приложение Windows при использовании компилятора csc, добавьте-target:winexe
к команде csc.exe следующим образом:C:\Windows\Microsoft.NET\Framework\v4.0.30319\csc.exe -out:example.exe -target:winexe example.cs