2010-08-26 27 views
138

Busqué en Google para obtener información sobre cómo ocultar mi propia ventana de consola. Sorprendentemente, las únicas soluciones que pude encontrar fueron las soluciones hacky que incluían 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 forma mucho mejor y más fácil, así que quería publicarla aquí para que otros la encuentren.Mostrar/Ocultar la ventana de la consola de una aplicación de consola C#

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

Respuesta

180

Así es 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); 
+3

La ventana sigue apareciendo momentáneamente al principio. Supongo que no hay forma de evitar esto, a menos que se cambie el tipo de aplicación. –

+1

Sería bueno si hubiera una forma de evitarlo. De esa forma puedo mostrar la consola cuando estoy en modo de depuración, pero simplemente ejecuto mi programa y salgo (sin ventana) cuando estoy en el modo de ejecución normal. – Vaccano

+6

@Vaccano: es posible hacer que su aplicación sea una aplicación de consola en el modo de depuración solo editando el archivo 'csproj' manualmente. Visual Studio no tiene GUI para hacer esto, pero respetará la configuración si edita el archivo 'csproj' correctamente. – Timwi

174

apenas van a Propiedades de la aplicación y cambiar el tipo de salida de aplicación de consola a Aplicación de Windows.

+0

Me siento como un numpty, parece tan obvio cuando me lo indicaron. Encontré esto tan difícil de googlear. – Crouch

+2

Aunque esto no responde la pregunta del OP, realmente aprecio que hayas dado esta respuesta. Era exactamente lo que necesitaba :) –

+1

u hizo mi día :) Gracias –

19

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

Recomiendo configurar Tipo de salida de proyecto a 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 la aplicación de la Consola.

+16

Porque podría 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. –

8

Ver mi post aquí:

Show Console in Windows Application

se puede hacer una aplicación de Windows (con o sin la ventana) y mostrar la consola si lo deseas. 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 abren.

+0

perfecto, gracias! –

+0

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

0

Si no desea depende de su uso de este título de la ventana:

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

tenemos que dar la ruta completa del archivo dll en DllImport ("fullPath") / –

0

Si usted no tiene un problema de la integración de una pequeña aplicación por lotes, existe este 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(); 

Añadir el exe a la solución, establecer la acción de construcción de "contenido", juego de copias de Directorio de salida a lo que le conviene, y cmdow ocultará la ventana de la consola cuando se corrió.

Para que la consola visible de nuevo, que acaba de cambiar los argumentos

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

Usted podría hacer lo invierte y establecer el tipo de salida de solicitud a: Aplicación para Windows. A continuación, 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 es showConsoletrue

Cuestiones relacionadas