visual - Mostrar/Ocultar la ventana de la consola de una aplicación de consola C#
hola mundo c# visual studio 2017 (7)
Busqué en Google información sobre cómo ocultar mi propia ventana de consola. Sorprendentemente, las únicas soluciones que pude encontrar fueron soluciones maliciosas que involucraron a FindWindow()
para encontrar la ventana de 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.
¿Cómo se oculta (y se muestra) la ventana de la consola asociada a mi propia aplicación de consola C #?
¿Por qué necesita una aplicación de consola si quiere ocultar la consola? =)
Recomiendo configurar el tipo de salida del proyecto a 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 la aplicación de la Consola.
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);
Puede hacer lo inverso y establecer el tipo de salida de la Aplicación en: Aplicación de 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 showConsole
es true
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());
Si no tiene problemas para integrar una aplicación de proceso por lotes pequeño, 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();
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 le convenga, y cmdow ocultará la ventana de la consola cuando se ejecute.
Para hacer que la consola sea visible nuevamente, solo cambia los Argumentos
HideConsole.StartInfo.Arguments = "MyConsole /Vis";
Simplemente acceda a Propiedades de la aplicación y cambie el Tipo de salida de la Aplicación de consola a la Aplicación de Windows .
Ver mi publicación aquí:
Mostrar consola en la aplicación de Windows
Puede hacer 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 abren.