Pregunta

¿Cómo creo, ejecuto y controlo un winform desde una aplicación de consola?

¿Fue útil?

Solución

La opción más fácil es iniciar un proyecto de formularios de Windows y luego cambiar el tipo de salida a Aplicación de consola. Alternativamente, solo agregue una referencia a System.Windows.Forms.dll y comience a codificar:

using System.Windows.Forms;

[STAThread]
static void Main() {
    Application.EnableVisualStyles();
    Application.Run(new Form()); // or whatever
}

Lo importante es el [STAThread] en su método Main () , requerido para el soporte COM completo.

Otros consejos

Hace poco quería hacer esto y descubrí que no estaba contento con ninguna de las respuestas aquí.

Si sigue los consejos de Marc y establece el tipo de salida en Aplicación de consola, hay dos problemas:

1) Si inicia la aplicación desde el Explorador, obtendrá una molesta ventana de consola detrás de su Formulario que no desaparecerá hasta que su programa salga. Podemos mitigar este problema llamando a FreeConsole antes de mostrar la GUI (Application.Run). La molestia aquí es que la ventana de la consola todavía aparece. Inmediatamente desaparece, pero está ahí por un momento, no obstante.

2) Si lo inicia desde una consola y muestra una GUI, la consola se bloquea hasta que la GUI salga. Esto se debe a que la consola (cmd.exe) cree que debería iniciar las aplicaciones de la Consola sincrónicamente y las aplicaciones de Windows de forma asincrónica (el equivalente de unix de "myprocess & amp;").


Si deja el tipo de salida como Aplicación de Windows, pero correctamente llama a AttachConsole, no obtiene una segunda ventana de consola cuando se invoca desde una consola y no obtiene la consola innecesaria cuando se invoca desde Explorer . La forma correcta de llamar a AttachConsole es pasarle -1. Esto hace que nuestro proceso se adjunte a la consola de nuestro proceso padre (la ventana de la consola que nos lanzó).

Sin embargo, esto tiene dos problemas diferentes:

1) Debido a que la consola inicia las aplicaciones de Windows en segundo plano, muestra inmediatamente el mensaje y permite una entrada adicional. Por un lado, estas son buenas noticias, la consola no está bloqueada en su aplicación GUI, pero en el caso de que desee volcar la salida a la consola y nunca mostrar la GUI, la salida de su programa se produce después de la solicitud y no aparece ninguna nueva. se muestra cuando haya terminado. Esto parece un poco confuso, sin mencionar que su " aplicación de consola " se ejecuta en segundo plano y el usuario puede ejecutar otros comandos mientras se ejecuta.

2) La redirección de la transmisión también se estropea, p. " myapp algunos parámetros > somefile " no puede redirigir El problema de redirección de flujo requiere una cantidad significativa de p / Invoke para reparar los controladores estándar, pero es solucionable.


Después de muchas horas de caza y experimentación, llegué a la conclusión de que no hay forma de hacerlo perfectamente. Simplemente no puede obtener todos los beneficios de la consola y la ventana sin ningún efecto secundario. Se trata de elegir qué efectos secundarios son los menos molestos para los fines de su aplicación.

Aquí está el mejor método que he encontrado: Primero, configure el tipo de salida de sus proyectos en "Aplicación de Windows", luego P / Invocar AllocConsole para crear una ventana de consola.

internal static class NativeMethods
{
    [DllImport("kernel32.dll")]
    internal static extern Boolean AllocConsole();
}

static class Program
{

    static void Main(string[] args) {
        if (args.Length == 0) {
            // run as windows app
            Application.EnableVisualStyles();
            Application.Run(new Form1()); 
        } else {
            // run as console app
            NativeMethods.AllocConsole();
            Console.WriteLine("Hello World");
            Console.ReadLine();
        }
    }

}

Es muy simple de hacer:

Simplemente agregue el siguiente atributo y código a su método Main:

[STAThread]
void Main(string[] args])
{
   Application.EnableVisualStyles();
   //Do some stuff...
   while(!Exit)
   {
       Application.DoEvents(); //Now if you call "form.Show()" your form won´t be frozen
       //Do your stuff
   }
}

Ahora puede mostrar completamente WinForms :)

Puede crear un proyecto winform en VS2005 / VS2008 y luego cambiar sus propiedades para que sea una aplicación de línea de comandos. Luego se puede iniciar desde la línea de comandos, pero aún se abrirá una forma de ganar.

Debería poder usar la clase Aplicación de la misma manera que las aplicaciones Winform. Probablemente la forma más fácil de comenzar un nuevo proyecto es hacer lo que Marc sugirió: crear un nuevo proyecto Winform y luego cambiarlo en las opciones a una aplicación de consola

Esto funcionó para mis necesidades ...

Task mytask = Task.Run(() =>
{
    MyForm form = new MyForm();
    form.ShowDialog();
});

Esto comienza desde un nuevo hilo y no libera el hilo hasta que se cierra el formulario. Task está en .Net 4 y versiones posteriores.

Depende totalmente de su elección, de cómo esté implementando.
a. Proceso adjunto, ej .: entrada en formulario e impresión en consola
segundo. Proceso independiente, por ejemplo: iniciar un temporizador, no cerrar incluso si la consola sale.

para a,

Application.Run(new Form1());
//or -------------
Form1 f = new Form1();
f.ShowDialog();

para b, Use hilo, o tarea cualquier cosa, ¿Cómo abrir el formulario de ganancias de forma independiente?

Si quiere escapar de Form Freeze y usar la edición (como texto para un botón) use este código

Form form = new Form();
Form.Button.Text = "randomText";
System.Windows.Forms.Application.EnableVisualStyles();
System.Windows.Forms.Application.Run(form);

Todas las respuestas anteriores son de gran ayuda, pero pensé agregar algunos consejos más para el principiante absoluto.

Entonces, desea hacer algo con formularios Windows Forms, en una aplicación de consola:

Agregue una referencia a System.Windows.Forms.dll en su proyecto de aplicación de consola en el Explorador de soluciones. (Haga clic derecho en Solution-name- > add- > Reference ...)

Especifique el espacio de nombre en el código: usando System.Windows.Forms;

Declare las propiedades necesarias en su clase para los controles que desea agregar al formulario.

p. int Left {get; conjunto; } // necesita especificar la posición IZQUIERDA del botón en el formulario

Y luego agregue el siguiente fragmento de código en Main () :

static void Main(string[] args)
{
Application.EnableVisualStyles();
        Form frm = new Form();  // create aForm object

        Button btn = new Button()
        {
            Left = 120,
            Width = 130,
            Height = 30,
            Top = 150,
            Text = "Biju Joseph, Redmond, WA"
        };
       //… more code 
       frm.Controls.Add(btn);  // add button to the Form
       //  …. add more code here as needed

       frm.ShowDialog(); // a modal dialog 
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top