Показати / приховати вікно консолі програми консолі C #


192

Я погуляв навколо, щоб дізнатися, як приховати власне вікно консолі. Дивовижно, що єдині рішення, які я міг знайти, були хиткі рішення, які передбачали FindWindow()пошук вікна консолі за назвою . Я заглибився трохи глибше в API Windows і виявив, що існує набагато кращий і простіший спосіб, тому я хотів опублікувати його тут, щоб інші знайшли.

Як приховати (і показати) вікно консолі, пов’язане з моєю власною програмою консолі C #?

Відповіді:


268

Просто зайдіть додатки Властивості і змінити тип виходу з консольного застосування в ОС Windows Application .


9
Хоча це не відповідає на питання ОП, я дуже вдячний, що ви даєте цю відповідь. Це було саме те, що мені було потрібно :)
kayleeFrye_onDeck

6
Це не є рішенням, оскільки таке вікно не може бути показане.
Michał Woliński

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

14
Вікно все ще з’являється на мить на початку. Я думаю, що це не обійдеться, якщо не змінити тип програми?
Ciaran Gallagher

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 замість програми консолі. Він не покаже вікно консолі, але виконає всі дії, як це робить додаток консолі.


28
Тому що може настати час, коли я насправді хочу це показати. Мовляв, консольна програма намагається виконувати речі і нікого не турбує так довго, як це успішно. Якщо ні, то вискакує і пропонує мені CLI.
Janis F

також 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
Він дійсно показує консоль з миготливим курсором, але ні консоль.WriteLine ("текст"), ні стандартний випуск.WriteLine ("текст") нічого не показує в моєму випадку. Чогось не вистачає?
Ronny D'Hoore

9

Дивіться мою публікацію тут:

Показати консоль у програмі Windows

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


Відмінно! найпростіший спосіб приховати консоль - це змінити тип проекту на додаток Windows.

4

"Просто сховати" ви можете:

Змініть тип виводу з програми Console Application на програму Windows ,

І замість цього Console.Readline/keyви можете використовувати new ManualResetEvent(false).WaitOne()в кінці, щоб тримати додаток.


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") /
Tushar Gupta - 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";
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.