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


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() para 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 encontraran.

¿Cómo ocultar (y mostrar) la ventana de consola asociada a mi propia aplicación de consola de C#?

Author: Timwi, 2010-08-26

7 answers

He aquí 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);
 204
Author: Timwi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-01-21 15:11:16

Simplemente vaya a las propiedades de la aplicacióny cambie el tipo de salida de Aplicación de consolaa Aplicación de Windows.

 203
Author: Fahad,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-10-02 15:28:55

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

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

 21
Author: Oleksandr Pshenychnyy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-08-15 14:42:20

Puede hacer lo inverso 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 showConsole es true

 13
Author: Maiko Kingma,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-11-20 14:14:27

Ver mi post aquí:

Mostrar Consola en la aplicación 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 se muestre explícitamente. Lo uso para aplicaciones de modo dual que quiero ejecutar en modo consola o gui dependiendo de cómo se abran.

 9
Author: Anthony,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 10:31:37

Si no quieres depender del título de la ventana usa 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());
 1
Author: rag,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-06-28 07:34:41

Si no tiene problemas para integrar una aplicación por lotes pequeña, existe este programa llamado Cmdow.exe que le permitirá ocultar las ventanas de la consola en función del 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", establezca Copiar en el directorio de salida a lo que más le convenga, y cmdow ocultará la ventana de la consola cuando se ejecute.

Para hacer la consola visible de nuevo, simplemente cambie los argumentos

HideConsole.StartInfo.Arguments = "MyConsole /Vis";
 0
Author: ScilsOff,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-03-27 15:30:47