Pokaż / ukryj okno konsoli aplikacji konsoli C #

192

Poszukałem informacji, jak ukryć własne okno konsoli. O dziwo, jedynymi rozwiązaniami, jakie mogłem znaleźć, były zhackowane rozwiązania polegające FindWindow()na znalezieniu okna konsoli według jego tytułu . Wkopałem się trochę głębiej w interfejs API systemu Windows i stwierdziłem, że istnieje o wiele lepszy i łatwiejszy sposób, więc chciałem opublikować go tutaj, aby inni mogli go znaleźć.

Jak ukryć (i pokazać) okno konsoli związane z moją własną aplikacją konsoli C #?

Timwi
źródło

Odpowiedzi:

268

Wystarczy przejść do aplikacji Właściwości i zmienić typ wyjścia z aplikacji konsoli do aplikacji Windows .

Fahad
źródło
9
Mimo że nie odpowiada to na pytanie PO, naprawdę doceniam udzielenie tej odpowiedzi. Właśnie tego potrzebowałem :)
kayleeFrye_onDeck
6
To nie jest rozwiązanie, ponieważ w ten sposób nie można wyświetlić okna.
Michał Woliński
6
To nie jest rozwiązanie tego, o co pytał plakat.
KansaiRobot
2
Choć świetne, to rozwiązanie nie pozwala programowo kontrolować, kiedy wyświetlać i ukrywać konsolę. Powiedzmy, że akceptujesz parametr konsoli, który po ustawieniu chcesz ukryć konsolę (tj. Tryb cichy, verbose = false)
TheLegendaryCopyCoder
3
Jest to świetne, gdy chcesz zaktualizować główny plik wykonywalny w tle, a następnie uruchomić go. dzięki
Ehsan
266

Oto jak:

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
źródło
14
Okno nadal pojawia się na chwilę na początku. Chyba nie można tego obejść, chyba że typ aplikacji zostanie zmieniony?
Ciaran Gallagher
2
Byłoby miło, gdyby istniało rozwiązanie tego problemu. W ten sposób mogę pokazać konsolę, gdy jestem w trybie debugowania, ale po prostu uruchom mój program i wyjdź (bez okna), gdy jestem w normalnym trybie uruchamiania.
Vaccano
8
@Vaccano: Można uczynić aplikację aplikacją konsolową w trybie debugowania tylko poprzez csprojręczną edycję pliku. Visual Studio nie ma graficznego interfejsu użytkownika, aby to zrobić, ale honoruje to ustawienie, jeśli csprojpoprawnie edytujesz plik.
Timwi
3
Potrzebujesz:using System.Runtime.InteropServices;
Anthony Nichols,
5
To bardzo miła odpowiedź, ale mogę dodać, że jeszcze jedna opcja, aby dodać, const int SW_SHOWMINIMIZED = 2;a następnie w ShowWindow(handle, SW_SHOWMINIMIZED); ten sposób konsola nie zaczyna się ukryta, tylko zminimalizowana.
KansaiRobot
22

Dlaczego potrzebujesz aplikacji konsolowej, jeśli chcesz ukryć samą konsolę? =)

Zalecam ustawienie typu Wyjście projektu na Aplikacja systemu Windows zamiast aplikacji konsoli. Nie wyświetli się okno konsoli, ale wykonaj wszystkie czynności, podobnie jak aplikacja Console.

Sasha
źródło
28
Ponieważ może nadejść czas, kiedy naprawdę chcę to pokazać. Aplikacja konsolowa próbuje wykonywać różne czynności i nie przeszkadza nikomu, dopóki się powiedzie. Jeśli nie, wyskakuje i oferuje mi interfejs CLI.
Janis F,
TopShelfpozwala również na prowadzenie Consolesjako usługa, a to łamie to
Pan Heelis
Jeśli chcesz, aby standardowe wyjście było dostępne w konsoli, potrzebujesz konsoli, tak prostej.
Totte Karlsson
20

Możesz zrobić to odwrotnie i ustawić typ danych wyjściowych aplikacji na: Aplikacja Windows. Następnie dodaj ten kod na początku aplikacji.

[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
}

Ten kod pokaże Konsolę, jeśli showConsolejesttrue

Maiko Kingma
źródło
1
Rzeczywiście pokazuje konsolę z migającym kursorem, ale ani Console.WriteLine („tekst”), ani standardOutput.WriteLine („tekst”) nie pokazuje niczego w moim przypadku. Czegoś brakuje?
Ronny D'Hoore
9

Zobacz mój post tutaj:

Pokaż konsolę w aplikacji Windows

Możesz utworzyć aplikację Windows (z oknem lub bez) i wyświetlać konsolę zgodnie z potrzebami. Korzystając z tej metody, okno konsoli nigdy się nie pojawia, chyba że zostanie to wyraźnie pokazane. Używam go do aplikacji w trybie podwójnym, które chcę uruchamiać w trybie konsoli lub GUI, w zależności od sposobu ich otwarcia.

Anthony
źródło
Doskonały! najprostszym sposobem na ukrycie konsoli jest zmiana typu projektu na aplikację Windows.
4

„Po prostu ukryć” możesz:

Zmień typ wyjścia z aplikacji konsoli do aplikacji Windows ,

Zamiast tego Console.Readline/keymożesz użyć new ManualResetEvent(false).WaitOne()na końcu, aby utrzymać działanie aplikacji.

NT
źródło
1

Jeśli nie chcesz zależeć od tytułu okna, użyj tego:

    [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());
szmata
źródło
musimy podać pełną ścieżkę pliku dll w DllImport („fullPath”) /
Tushar Gupta - curioustushar
0

Jeśli nie masz problemu z integracją małej aplikacji wsadowej, istnieje program o nazwie Cmdow.exe , który pozwala ukryć okna konsoli na podstawie tytułu konsoli.

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

Dodaj exe do rozwiązania, ustaw akcję kompilacji na „Treść”, ustaw opcję Kopiuj do katalogu wyjściowego na odpowiadającą Ci, a cmdow ukryje okno konsoli po uruchomieniu.

Aby ponownie wyświetlić konsolę, wystarczy zmienić Argumenty

HideConsole.StartInfo.Arguments = "MyConsole /Vis";
ScilsOff
źródło