2011-01-18 47 views
8

¿Es posible llamar a Application.Run, pero no pasar un parámetro de formulario, o hay una alternativa si no hay forma de llamar?C# Application.Run without Form

El método Run no parece tener ninguna sobrecarga que no acepte un formulario.

Por ejemplo, si quería crear una instancia de una clase en primer lugar, y luego tener que llamar a la forma, ¿hay manera de hacer el equivalente de:

Application.Run(myClass); 

Solo para aclarar, yo todavía quiero la funcionalidad que .Run() proporciona. Es decir, establezca un bucle para mantener la aplicación en ejecución, pero en lugar de seguir un formulario, realice el seguimiento de una clase u otro objeto.

Esto está relacionado con el marco compacto inicialmente. Supongo que es por eso que el método Run no tiene la sobrecarga que estaba buscando.

+0

http://msdn.microsoft.com/en-us/library/aa288463(v=vs.71).aspx –

+0

¿Qué estás tratando de hacer? 'Application.Run' básicamente inicia _message pump_ que es responsable de enviar mensajes a Windows y controladores de eventos. ¿Cuál es el propósito de ingresar una bomba de mensaje_ si no existe una ventana? –

+0

He editado mi pregunta. Lo que en realidad estoy tratando de hacer es lanzar la primera forma desde una clase no estática. Así que quise crear una instancia de la clase y luego lanzar el formulario. –

Respuesta

6

No me queda claro si desea hacer:

  1. desea cargar el formulario en otro lugar que no sea el principal()
  2. o ejecutar una aplicación de consola o servicio con sin UI.

Para (1):

static void main() 
{ 
    //Your program starts running here<<< 

    //Do some stuff... 
    FormRunner a = new FormRunner(); 
    a.RunForm(); 

} // << And ends here 

class FormRunner { 

    public void RunForm() { 
     Application.Run(new Form()); 
    } 

    //You could call which ever form you want from here? 
} // << And ends here 

Lo que hay que saber es que su programa se inicia desde la primera línea de la principal y termina en el pasado. Sin embargo,, cuando llame al Application.Run(FORM) carga un windows message loop para ese formulario. Es un bucle especial que mantiene el programa todavía en espera y espera eventos (se les llama Mensajes de Windows en la API de win32)

Y así el programa no termina hasta que el usuario haga clic en el botón de cerrar. Cuando esto sucede, es cuando su programa realmente va a return desde su Main.

(2) Así que ahora si lo que desea es una aplicación de consola puro sin formas:

static void main() 
{ 
    AcceptInputs() 
    DrawScreen() 

    //Do something else. 
    //Make sure your flow stays within the main 

} // << Once you come here you're done. 

void AcceptInputs() 
{ 
    while(true) { 

     //Keep accepting input 
     break; // Call break when you're done. You'll be back in the main 
    } 
} 

espero que ayudó.

+0

La última frase de su parte 1 es incorrecta. Applicaiton.Run (FORM) no regresa cuando el formulario principal está cerrado. Llama a Exit (int) o a ThreadExit (...), lo cual es horrible porque hace 'try {Application.Run (new main_form());} catch (excepción e) {...} finalmente {.. .} 'no hagas lo que esperas. – nategoose

14

El método Run no parece tener sobrecargas que no acepten un formulario.

Uh ... http://msdn.microsoft.com/en-us/library/ms157900.aspx

Application.Run Método

comienza a funcionar un bucle de mensaje de aplicación estándar en el hilo actual, sin una forma.

public static void Run()

3

Puede utilizar la sobrecarga de Application.Run que acepte un contexto de aplicación como su único parámetro. Un ApplicationContext es básicamente una clase de la que puedes heredar y agregar cualquier funcionalidad que desees. Vea el ejemplo en el enlace para más información.

0
using System; 
using System.Windows.Forms; 

static class Program 
    [STAThread] 
    static void Main() { 
     Application.Run(new myClass()); 
    } 

    internal class myClass : ApplicationContext { 
     public myClass() { 
     Application.Run(new myWindow()); 
     } 
    } 
} 

El problema aquí, sin embargo, es que algo va a tener que llamar a esta instancia de myClass y decirle que para salir o de lo contrario el programa simplemente sigue funcionando incluso después de todas las formas están cerrados. Y se ignora llamar a ExitThread() en el constructor.