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

191

Procurei no Google informações sobre como esconder a própria janela do console. Surpreendentemente, as únicas soluções que pude encontrar foram soluções hacky que envolviam FindWindow()encontrar a janela do console por seu título . Analisei um pouco mais a API do Windows e descobri que existe uma maneira muito melhor e mais fácil, então eu queria publicá-la aqui para que outras pessoas o encontrassem.

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

Timwi
fonte

Respostas:

265

Aqui está 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);
Timwi
fonte
14
A janela ainda aparece momentaneamente no começo. Eu acho que não há maneira de contornar isso, a menos que o tipo de aplicativo seja alterado?
Ciaran Gallagher
2
Seria bom se houvesse uma maneira de contornar isso. Dessa forma, eu posso mostrar o console quando estiver no modo de depuração, mas apenas execute o meu programa e saia (sem janela) quando estiver no modo de execução normal.
Vaccano
8
@ Vulcano: É possível tornar seu aplicativo um aplicativo de console no modo Debug apenas editando o csprojarquivo manualmente. O Visual Studio não tem GUI para fazer isso, mas respeitará a configuração se você editar o csprojarquivo corretamente.
Timwi
3
Preciso:using System.Runtime.InteropServices;
Anthony Nichols
5
Esta é uma resposta muito boa, mas devo acrescentar que mais uma opção a adicionar é const int SW_SHOWMINIMIZED = 2;e, ShowWindow(handle, SW_SHOWMINIMIZED); dessa forma, o console não fica oculto, apenas minimizado.
KansaiRobot
265

Basta acessar as Propriedades do aplicativo e alterar o tipo de Saída de Aplicativo do console para Aplicativo do Windows .

Fahad
fonte
9
Mesmo que isso não responda à pergunta do OP, eu realmente aprecio sua resposta. É exatamente o que eu precisei :) #
22414 kayleeFrye_onDeck
6
Isso não é solução, porque essa janela não pode ser exibida.
Michał Woliński
6
Esta não é uma solução para o que o cartaz pediu.
KansaiRobot
1
Embora excelente, esta solução não permite controlar programaticamente quando mostrar e ocultar o console. Vamos dizer que você aceitar um param consola que, quando configurado você quer esconder seu console (ou seja, modo silencioso, verbose = false)
TheLegendaryCopyCoder
3
Isso é ótimo quando você deseja atualizar o arquivo executável principal em segundo plano e executá-lo. obrigado
Ehsan
22

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

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

Sasha
fonte
28
Porque pode chegar um momento em que realmente quero mostrar isso. Assim, o aplicativo do console tenta executar coisas e não incomoda ninguém, pois é bem-sucedido. Caso contrário, ele aparece e me oferece uma CLI.
Jan13
Também TopShelfpermite que você execute Consolescomo um serviço e este breaks que
Sr. Heelis
Se você deseja que o padrão esteja disponível em um console, será necessário um console simples assim.
Totte Karlsson 20/02
20

Você pode fazer o inverso e definir o tipo de saída do aplicativo como: Aplicativo do Windows. Em seguida, adicione esse 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 showConsolefortrue

Maiko Kingma
fonte
Na verdade, ele mostra o console com um cursor piscando, mas nem Console.WriteLine ("texto") nem standardOutput.WriteLine ("texto") mostram qualquer coisa no meu caso. Falta alguma coisa?
Ronny D'Hoore
9

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 conforme desejado. Usando esse método, a janela do console nunca aparece, a menos que você o mostre explicitamente. Eu o uso para aplicativos de modo duplo que desejo executar no modo console ou GUI, dependendo de como eles são abertos.

Anthony
fonte
Excelente! a maneira mais fácil de ocultar o console é alterar o tipo de projeto para o aplicativo Windows.
4

"Apenas para ocultar" você pode:

Altere o tipo de saída de Aplicativo do console para Aplicativo do Windows ,

E em vez de Console.Readline/keyvocê pode usar new ManualResetEvent(false).WaitOne()no final para manter o aplicativo em execução.

NT
fonte
1

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

    [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());
trapo
fonte
nós temos que dar caminho completo do dll arquivo em DllImport ( "fullPath") /
Tushar Gupta - curioustushar
0

Se você não tiver problemas para integrar um aplicativo em lote pequeno, existe um 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 compilação como "Conteúdo", defina Copiar para o Diretório de Saída para o que melhor combina com você e o cmdow ocultará a janela do console quando for executada.

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

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