como executar um winform de aplicativo de console?

Como faço para criar, executar e controlar uma forma de vitória de dentro de um aplicativo de console?

   

A opção mais fácil é iniciar um projeto de formulários do Windows e, em seguida, alterar o tipo de saída para o Aplicativo do Console. Como alternativa, basta adicionar uma referência ao System.Windows.Forms.dll e iniciar a codificação:

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

O bit importante é o [STAThread] no seu método Main() , requerido para suporte total ao COM.

Recentemente, eu queria fazer isso e descobri que não estava feliz com nenhuma das respostas aqui.

Se você seguir o conselho de Marc e definir o tipo de saída para o Aplicativo do Console, haverá dois problemas:

1) Se você iniciar o aplicativo a partir do Explorer, você terá uma janela de console irritante atrás do seu Formulário, que não irá embora até que o seu programa saia. Podemos atenuar esse problema chamando o FreeConsole antes de mostrar a GUI (Application.Run). O aborrecimento aqui é que a janela do console ainda aparece. Ele vai embora imediatamente, mas fica por um momento, no entanto.

2) Se você iniciá-lo a partir de um console e exibir uma GUI, o console ficará bloqueado até a GUI sair. Isso ocorre porque o console (cmd.exe) acha que deve iniciar os aplicativos do console de forma síncrona e os aplicativos do Windows de forma assíncrona (o equivalente unix de “myprocess &”).

Se você deixar o tipo de saída como Aplicativo do Windows, mas chamar corretamente AttachConsole, não obterá uma segunda janela do console quando chamado a partir de um console e não obterá o console desnecessário quando chamado a partir do Explorer. A maneira correta de chamar AttachConsole é passar -1 para ele. Isso faz com que nosso processo seja anexado ao console do nosso processo pai (a janela do console que nos lançou).

No entanto, isso tem dois problemas diferentes:

1) Como o console inicia aplicativos do Windows em segundo plano, ele exibe imediatamente o prompt e permite mais informações. Por um lado, esta é uma boa notícia, o console não está bloqueado em seu aplicativo GUI, mas no caso em que você deseja despejar a saída para o console e nunca mostrar a GUI, a saída do seu programa vem após o prompt e nenhum novo prompt é exibido quando estiver pronto. Isso parece um pouco confuso, sem mencionar que seu “aplicativo de console” está sendo executado em segundo plano e que o usuário está livre para executar outros comandos enquanto estiver em execução.

2) O redirecionamento de stream também é confuso, por exemplo, “myapp some parameters> somefile” não consegue redirect. O problema de redirecionamento de stream requer uma quantidade significativa de p / Invoke para corrigir as alças padrão, mas é solucionável.

Depois de muitas horas de caça e experimentação, cheguei à conclusão de que não há como fazer isso perfeitamente. Você simplesmente não pode obter todos os benefícios do console e da janela sem nenhum efeito colateral. É uma questão de escolher quais efeitos colaterais são menos irritantes para os propósitos da sua aplicação.

Aqui está o melhor método que eu encontrei: Primeiro, defina o tipo de saída do seu projeto para “Windows Application”, então P / Invoke AllocConsole para criar uma janela do console.

 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(); } } } 

É muito simples de fazer:

Basta adicionar o seguinte atributo e código ao seu 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 } } 

Agora você é totalmente capaz de mostrar WinForms 🙂

Você pode criar um projeto WinForm no VS2005 / VS2008 e, em seguida, alterar suas propriedades para ser um aplicativo de linha de comando. Pode então ser iniciado a partir da linha de comando, mas ainda abrirá uma winform.

Você deve ser capaz de usar a class Application da mesma maneira que os aplicativos Winform. Provavelmente, a maneira mais fácil de iniciar um novo projeto é fazer o que Marc sugeriu: criar um novo projeto WinForm e, em seguida, alterá-lo nas opções para um aplicativo de console

Isso funcionou para as minhas necessidades …

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

Isso inicia o em um novo segmento e não libera o segmento até que o formulário seja fechado. Task está no .net 4 e posterior.

Depende totalmente da sua escolha, de como você está implementando.
uma. Processo anexado, ex: input no formulário e impressão no console
b. Processo independente, ex: inicie um timer, não feche mesmo que a saída do console.

para,

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

para b, Use thread, ou qualquer coisa, Como abrir o formulário de ganhar de forma independente?

Se você quiser escaping do Form Freeze e usar a edição (como texto para um botão) use este código

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

Todas as respostas acima são de grande ajuda, mas eu pensei em adicionar mais algumas dicas para o iniciante absoluto.

Então, você quer fazer algo com o Windows Forms, em um aplicativo de console:

Adicione uma referência ao System.Windows.Forms.dll no seu projeto de aplicativo de console no Solution Explorer. (Clique com o botão direito em Solution-name-> add-> Reference …)

Especifique o espaço de nomes no código: using System.Windows.Forms;

Declare as propriedades necessárias em sua class para os controles que você deseja adicionar ao formulário.

por exemplo 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

Em seguida, adicione o seguinte trecho de código em 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 }