Pregunta

¿Hay alguna forma de ocultar la ventana de la consola al ejecutar una aplicación de consola?

Actualmente estoy usando una aplicación de Windows Forms para iniciar un proceso de consola, pero no quiero que se muestre la ventana de la consola mientras se ejecuta la tarea.

¿Fue útil?

Solución

Si está utilizando la clase ProcessStartInfo , puede configurar el estilo de ventana como oculto:

System.Diagnostics.ProcessStartInfo start =
      new System.Diagnostics.ProcessStartInfo();
start.FileName = dir + @"\Myprocesstostart.exe";
start.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;

Otros consejos

Si escribió la aplicación de consola, puede ocultarla de forma predeterminada.

Cree una nueva aplicación de consola y luego cambie el " Tipo de salida " escriba a " Aplicación de Windows " (hecho en las propiedades del proyecto)

Si está utilizando Process Class, puede escribir

yourprocess.StartInfo.UseShellExecute = false;
yourprocess.StartInfo.CreateNoWindow = true;

antes de yourprocess.start (); y el proceso se ocultará

La respuesta simple es: Vaya a las propiedades de la aplicación de su consola (propiedades del proyecto). En la " Aplicación " pestaña, simplemente cambie el " Tipo de salida " a " Aplicación de Windows " ;. Eso es todo.

Puede usar el FreeConsole API para separar la consola del proceso:

[DllImport("kernel32.dll")]
static extern bool FreeConsole();

(por supuesto, esto solo es aplicable si tiene acceso al código fuente de la aplicación de consola)

Si está interesado en el resultado, puede usar esta función:

private static string ExecCommand(string filename, string arguments)
{
    Process process = new Process();
    ProcessStartInfo psi = new ProcessStartInfo(filename);
    psi.Arguments = arguments;
    psi.CreateNoWindow = true;
    psi.RedirectStandardOutput = true;
    psi.RedirectStandardError = true;
    psi.UseShellExecute = false;
    process.StartInfo = psi;

    StringBuilder output = new StringBuilder();
    process.OutputDataReceived += (sender, e) => { output.AppendLine(e.Data); };
    process.ErrorDataReceived += (sender, e) => { output.AppendLine(e.Data); };

    // run the process
    process.Start();

    // start reading output to events
    process.BeginOutputReadLine();
    process.BeginErrorReadLine();

    // wait for process to exit
    process.WaitForExit();

    if (process.ExitCode != 0)
        throw new Exception("Command " + psi.FileName + " returned exit code " + process.ExitCode);

    return output.ToString();
}

Ejecuta el programa de línea de comando dado, espera a que termine y devuelve la salida como cadena.

Si está creando un programa que no requiere la intervención del usuario, siempre puede crearlo como un servicio. Un servicio no mostrará ningún tipo de interfaz de usuario.

Sé que no estoy respondiendo exactamente lo que quieres, pero me pregunto si estás haciendo la pregunta correcta.

¿Por qué no usas tampoco?

  1. servicio de windows
  2. crea un nuevo hilo y ejecuta tu proceso en eso

Esas suenan como mejores opciones si todo lo que quieres es ejecutar un proceso.

Agregue esto a su clase para importar el archivo DLL:

[DllImport("user32.dll")]
    static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);

    const int SW_HIDE = 0;
    const int SW_SHOW = 5;

Y luego, si quieres ocultarlo, usa este comando:

var handle = GetConsoleWindow();
ShowWindow(handle, SW_HIDE);

Y si quieres mostrar la consola:

var handle = GetConsoleWindow();
ShowWindow(handle, SW_SHOW);

Basado en la respuesta de Adam Markowitz anterior, lo siguiente funcionó para mí:

process = new Process();
process.StartInfo = new ProcessStartInfo("cmd.exe", "/k \"" + CmdFilePath + "\"");
process.StartInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;
//process.StartInfo.UseShellExecute = false;
//process.StartInfo.CreateNoWindow = true;
process.Start();

Tengo una solución general para compartir:

using System;
using System.Runtime.InteropServices;

namespace WhateverNamepaceYouAreUsing
{
    class Magician
    {
        [DllImport("kernel32.dll")]
        static extern IntPtr GetConsoleWindow();

        [DllImport("user32.dll")]
        static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);

        const int HIDE = 0;
        const int SHOW = 5;

        public static void DisappearConsole()
        {
            ShowWindow(GetConsoleWindow(), HIDE);
        }
    }
}

Simplemente incluya esta clase en su proyecto y llame a Magician.DisappearConsole (); .

Una consola parpadeará cuando inicies el programa haciendo clic en ella. Al ejecutar desde el símbolo del sistema, el símbolo del sistema desaparece poco después de la ejecución.

Hago esto para un Discord Bot que se ejecuta para siempre en el fondo de mi computadora como un proceso invisible. Fue más fácil que hacer que TopShelf funcione para mí. Un par de tutoriales de TopShelf me fallaron antes de escribir esto con ayuda del código que encontré en otro lugar. ; P

También intenté simplemente cambiar la configuración en Visual Studio > Proyecto > Propiedades > La aplicación se iniciará como una aplicación de Windows en lugar de una aplicación de consola, y algo sobre mi proyecto evitó que esto ocultara mi consola, tal vez porque DSharpPlus exige iniciar una consola al inicio. No lo sé. Cualquiera sea la razón, esta clase me permite matar fácilmente la consola después de que aparezca.

Espero que este mago ayude a alguien. ;)

Solo escribe

ProcessStartInfo psi= new ProcessStartInfo("cmd.exe");
......

psi.CreateNoWindow = true;

Aunque como otras respuestas aquí han dicho, puede cambiar el " Tipo de salida " a "Aplicación de Windows", tenga en cuenta que esto significa que no puede usar Console.In ya que se convertirá en un NullStreamReader.

Sin embargo,

Console.Out y Console.Error parecen funcionar bien.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top