Mostrar / Ocultar la ventana de la consola de una aplicación de consola C #

191

Busqué en Google información sobre cómo ocultar la propia ventana de la consola. Sorprendentemente, las únicas soluciones que pude encontrar fueron soluciones hacky que involucraron FindWindow()encontrar la ventana de la consola por su título . Profundicé un poco más en la API de Windows y descubrí que hay una manera mucho mejor y más fácil, así que quería publicarla aquí para que otros la encuentren.

¿Cómo se oculta (y muestra) la ventana de la consola asociada con mi propia aplicación de consola C #?

Timwi
fuente

Respuestas:

265

Así es cómo:

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
fuente
14
La ventana todavía aparece momentáneamente al principio. Supongo que no hay forma de evitar esto, a menos que se cambie el tipo de aplicación.
Ciaran Gallagher
2
Sería bueno si hubiera una forma de evitarlo. De esa manera, puedo mostrar la consola cuando estoy en modo de depuración, pero solo ejecuto mi programa y salgo (sin ventana) cuando estoy en modo de ejecución normal.
Vaccano
8
@ Vaccano: es posible convertir su aplicación en una consola en modo de depuración solo editando el csprojarchivo manualmente. Visual Studio no tiene GUI para hacer esto, pero respetará la configuración si edita el csprojarchivo correctamente.
Timwi
3
Necesidad:using System.Runtime.InteropServices;
Anthony Nichols
55
Esta es una respuesta muy buena, pero podría agregar que una opción más para agregar es const int SW_SHOWMINIMIZED = 2;y luego ShowWindow(handle, SW_SHOWMINIMIZED); De esta manera, la consola comienza no oculta, solo minimizada.
KansaiRobot
265

Simplemente vaya a Propiedades de la aplicación y cambie el Tipo de salida de Aplicación de consola a Aplicación de Windows .

Fahad
fuente
9
Aunque esto no responde la pregunta del OP, realmente aprecio que hayas respondido. Era exactamente lo que necesitaba :)
kayleeFrye_onDeck
66
Esto no es una solución, porque de esta manera no se puede mostrar la ventana.
Michał Woliński
66
Esta no es una solución a lo que pidió el cartel.
KansaiRobot
1
Si bien es excelente, esta solución no le permite controlar mediante programación cuándo mostrar y ocultar la consola. Digamos que acepta un parámetro de consola que, cuando está configurado, desea ocultar su consola (es decir, modo silencioso, detallado = falso)
TheLegendaryCopyCoder
3
Esto es genial cuando desea actualizar su archivo ejecutable principal en segundo plano y luego ejecutarlo. gracias
Ehsan
22

¿Por qué necesita una aplicación de consola si desea ocultar la consola en sí? =)

Recomiendo configurar el tipo de salida del proyecto para la aplicación de Windows en lugar de la aplicación de consola. No le mostrará la ventana de la consola, pero ejecutará todas las acciones, como lo hace la aplicación Consola.

Sasha
fuente
28
Porque puede llegar un momento en que realmente quiera mostrarlo. Al igual, la aplicación de consola intenta realizar cosas y no molesta a nadie mientras tenga éxito. Si no, aparece y me ofrece una CLI.
Janis F
también le TopShelfpermite ejecutar Consolescomo un servicio y esto rompe eso
Sr. Heelis
Si desea que la salida estándar esté disponible en una consola, necesitará una consola, así de simple.
Totte Karlsson
20

Puede hacer lo contrario y establecer el tipo de salida de la aplicación en: Aplicación de Windows. Luego agregue este código al comienzo de la aplicación.

[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á la consola si showConsoleestrue

Maiko Kingma
fuente
De hecho, muestra la consola con un cursor parpadeante, pero ni Console.WriteLine ("texto") ni standardOutput.WriteLine ("texto") muestra nada en mi caso. ¿Falta algo?
Ronny D'Hoore
9

Mira mi publicación aquí:

Mostrar consola en la aplicación de Windows

Puede crear una aplicación de Windows (con o sin la ventana) y mostrar la consola como desee. Con este método, la ventana de la consola nunca aparece a menos que la muestre explícitamente. Lo uso para aplicaciones de modo dual que quiero ejecutar en modo consola o modo GUI, dependiendo de cómo se abran.

Antonio
fuente
¡Excelente! La forma más fácil de ocultar la consola es cambiar el tipo de proyecto a la aplicación de Windows.
4

"Solo para esconderse" puedes:

Cambie el tipo de salida de la Aplicación de consola a la Aplicación de Windows ,

Y en lugar de Console.Readline/keyque pueda utilizar new ManualResetEvent(false).WaitOne()al final para mantener la aplicación en ejecución.

Nuevo Testamento
fuente
1

Si no quiere depende del título de la ventana, use esto:

    [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
fuente
tenemos que dar la ruta completa del archivo dll en DllImport ("fullPath") /
Tushar Gupta - curioustushar
0

Si no tiene problemas para integrar una aplicación de lotes pequeños, existe un programa llamado Cmdow.exe que le permitirá ocultar las ventanas de la consola según el título de la consola.

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

Agregue el exe a la solución, establezca la acción de compilación en "Contenido", configure Copiar en el directorio de salida como más le convenga, y cmdow ocultará la ventana de la consola cuando se ejecute.

Para hacer que la consola sea visible nuevamente, simplemente cambie los Argumentos

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