cómo ejecutar un winform desde la aplicación de la consola?

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

La opción más fácil es iniciar un proyecto de formularios de Windows y luego cambiar el tipo de salida a la Aplicación de consola. De forma alternativa, simplemente 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 } 

El bit importante es el [STAThread] en su método Main() , requerido para una compatibilidad total con COM.

Recientemente quise hacer esto y descubrí que no estaba contento con ninguna de las respuestas aquí.

Si sigues el consejo de Marc y configuras el tipo de salida para la aplicación de consola, hay dos problemas:

1) Si inicia la aplicación desde Explorer, obtiene una ventana de consola molesta detrás de su Formulario que no desaparece hasta que se cierra su progtwig. 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 se va, pero está allí por un momento de todos modos.

2) Si lo inicia desde una consola y muestra una GUI, la consola se bloquea hasta que se cierre la GUI. Esto se debe a que la consola (cmd.exe) cree que debería iniciar las aplicaciones de la consola de forma sincrónica y las aplicaciones de Windows de forma asincrónica (el equivalente de UNIX de “myprocess &”).

Si deja el tipo de salida como aplicación de Windows, pero llama correctamente 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 pasar -1 a él. Esto hace que nuestro proceso se adjunte a la consola de nuestro proceso principal (la ventana de la consola que nos lanzó).

Sin embargo, esto tiene dos problemas diferentes:

1) Debido a que la consola lanza aplicaciones de Windows en segundo plano, inmediatamente muestra la solicitud y permite más entradas. Por un lado, esta es una buena noticia, la consola no está bloqueada en su aplicación GUI, pero en el caso en que quiera volcar la salida a la consola y nunca mostrar la GUI, la salida de su progtwig aparecerá después del aviso y no mostrado cuando termines Esto parece un poco confuso, sin mencionar que su “aplicación de consola” se ejecuta en segundo plano y que el usuario puede ejecutar otros comandos mientras se ejecuta.

2) La redirección de stream se confunde también, por ejemplo, “myapp some parameters> somefile” no puede redirigir. El problema de redirección de flujo requiere una cantidad significativa de p / Invoke para reparar los identificadores estándar, pero es solvente.

Después de muchas horas de cacería y experimentación, he llegado a la conclusión de que no hay forma de hacer esto a la perfección. Simplemente no puede obtener todos los beneficios de la consola y la ventana sin ningún efecto secundario. Es una cuestión de elegir qué efectos secundarios son menos molestos para los propósitos de su aplicación.

Este es el mejor método que he encontrado: primero, establezca el tipo de salida de sus proyectos en “Aplicación de Windows”, luego P / Invoque 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 principal:

 [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 puedes mostrar WinForms 🙂

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

Debería poder utilizar la clase Application 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 de 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 posterior.

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

para,

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

para b, usar hilo o hacer cualquier cosa, ¿cómo abrir formulario de ganar de forma independiente?

Si desea escapar de Form Freeze y usar la edición (como el texto de 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é en agregar algunos consejos más para el principiante absoluto.

Entonces, quiere hacer algo con 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: using System.Windows.Forms;

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

por ejemplo int Left { get; set; } // need to specify the LEFT position of the button on the Form int Left { get; set; } // need to specify the LEFT position of the button on the Form

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 }