Mostrar / ocultar a janela do console de um aplicativo de console C #

Eu pesquisei em torno de informações sobre como esconder a própria janela do console. Surpreendentemente, as únicas soluções que encontrei foram soluções hacky que envolviam FindWindow() para encontrar a janela do console pelo título . Mergulhei um pouco mais na API do Windows e descobri que há uma maneira muito melhor e mais fácil, então queria postá-la aqui para outras pessoas encontrarem.

Como você esconde (e mostra) a janela do console associada ao meu próprio aplicativo de console C #?

Veja como:

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

Basta ir para as propriedades do aplicativo e alterar o tipo de saída do aplicativo de console para o aplicativo do Windows .

Por que você precisa de um aplicativo de console se quiser ocultar o próprio console? =)

Eu recomendo definir o tipo de saída do projeto para o aplicativo do Windows em vez do aplicativo de console. Ele não mostrará a janela do console, mas executará todas as ações, como o aplicativo Console.

Você poderia fazer o reverso e definir o tipo de saída do aplicativo para: Windows Application. Em seguida, adicione este código ao início do aplicativo.

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

Este código mostrará o console se showConsole for true

Veja meu post aqui:

Mostrar console no aplicativo do Windows

Você pode criar um aplicativo do Windows (com ou sem a janela) e mostrar o console como desejado. Usando esse método, a janela do console nunca aparece, a menos que você a mostre explicitamente. Eu o uso para aplicativos de modo dual que eu quero rodar no console ou no modo GUI, dependendo de como eles são abertos.

Se você não quiser depende do título da janela, use isto:

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

Se você não tiver um problema ao integrar um pequeno aplicativo em lote, existe esse programa chamado Cmdow.exe que permitirá ocultar as janelas do console com base no título do console.

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

Adicione o exe à solução, defina a ação de construção como “Conteúdo”, defina Copiar para o Diretório de Saída para o que mais lhe convier e o cmdow ocultará a janela do console quando ela for executada.

Para tornar o console visível novamente, basta alterar os Argumentos

 HideConsole.StartInfo.Arguments = "MyConsole /Vis";